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.