Sobes.tech
Junior

Czym jest modyfikator pamięci weak w Swift?

sobes.tech AI

Odpowiedź od AI

Modyfikator weak jest używany do przerwania cykli silnych referencji między obiektami, gdy jeden obiekt ma silną referencję do drugiego, a ten z kolei ma silną referencję z powrotem.

Główne cechy weak:

  • Nie zwiększa licznika referencji: Użycie weak nie zwiększa liczby silnych referencji do obiektu.
  • Może być nil: Referencja słaba jest opcjonalna (Optional) i automatycznie staje się nil, gdy obiekt, na który się odwołuje, jest deinitializowany.
  • Używana do relacji rodzic/dziecko: Często stosowana, gdy obiekt dziecka ma referencję do swojego rodzica, aby uniknąć cykli silnych referencji.
  • Wymaga deklaracji jako var: Ponieważ referencja słaba może stać się nil, musi być zmienną (var), a nie stałą (let).

Przykład użycia:

class Person {
    let name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) jest inicjalizowany")
    }

    deinit {
        print("\(name) jest deinitializowany")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Referencja słaba

    init(unit: String) {
        self.unit = unit
        print("Mieszkanie \(unit) jest inicjalizowane")
    }

    deinit {
        print("Mieszkanie \(unit) jest deinitializowane")
    }
}

Bez weak var tenant: Person? w klasie Apartment, powstałby cykl silnych referencji, a instancje Person i Apartment nie zostałyby zdeinitializowane, gdy nie byłoby na nie innych silnych referencji. Dzięki weak, gdy instancja Person jest deinitializowana, odwołanie tenant w instancji Apartment automatycznie staje się nil.