Sobes.tech
Junior — Middle

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 unowned spowoduje 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.