Sobes.tech
Junior — Middle

Czy sytuacje związane z używaniem słabych (unowned) referencji mogą prowadzić do awarii aplikacji? Podaj przykład.

sobes.tech AI

Odpowiedź od AI

Tak, użycie słabych (unowned) referencji w Swift może spowodować awarię aplikacji, jeśli obiekt, na który odnosi się referencja unowned, został już zwolniony, a próba dostępu do tej referencji następuje później.

Referencje nieposiadające zakładają, że obiekt istnieje zawsze, gdy referencja jest żywa. Jeśli tak nie jest, aplikacja się zawiesi z błędem "EXC_BAD_ACCESS".

Przykład:

class Person {
    var apartment: Apartment?
}

class Apartment {
    unowned let tenant: Person
    init(tenant: Person) {
        self.tenant = tenant
    }
}

var john: Person? = Person()
john!.apartment = Apartment(tenant: john!)

john = nil // obiekt Person jest zwalniany

// Teraz apartment.tenant to referencja unowned do już zwolnionego obiektu
// Próba dostępu do niej spowoduje awarię
print(john!.apartment!.tenant) // crash

Aby uniknąć takich awarii, należy upewnić się, że referencja unowned nie będzie używana po zwolnieniu obiektu, lub używać referencji weak, które stają się nil po zwolnieniu obiektu.