Czym różni się użycie słów kluczowych 'unowned' i 'strong' przy deklarowaniu referencji w Swift?
sobes.tech AI
Odpowiedź od AI
W Swift słowa kluczowe strong i unowned służą do zarządzania referencjami i zapobiegania cyklom zatrzymania (retain cycles).
-
strong — to standardowa silna referencja, która zwiększa licznik referencji obiektu. Dopóki istnieje przynajmniej jedna silna referencja, obiekt nie zostanie usunięty z pamięci.
-
unowned — to słaba, ale nie opcjonalna referencja. Nie zwiększa licznika referencji, ale zakłada, że obiekt, na który się odnosi, zawsze istnieje podczas korzystania z tej referencji. Jeśli obiekt został już usunięty, dostęp do referencji
unownedspowoduje błąd w czasie wykonywania.
Przykład:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
let john = Person()
let apt = Apartment(tenant: john)
john.apartment = apt
Tutaj tenant jest zadeklarowany jako unowned, ponieważ mieszkanie nie powinno utrzymywać osoby silną referencją, aby uniknąć cyklu, ale zakłada się, że osoba istnieje dłużej niż mieszkanie.