Junior — Middle
Jakie powody sprawiają, że korzystanie z Unowned jest mniej preferowane w niektórych sytuacjach?
sobes.tech AI
Odpowiedź od AI
Użycie unowned w iOS (Swift) jest mniej preferowane w sytuacjach, gdy istnieje ryzyko, że obiekt, na który odwołuje się unowned, może zostać zwolniony (deallocated) wcześniej, niż zostanie użyte odwołanie. W przeciwieństwie do weak, unowned nie jest opcjonalne i nie staje się nil po zwolnieniu obiektu, więc dostęp do takiego odwołania po zwolnieniu spowoduje awarię aplikacji (błąd w czasie działania).
Powody, aby unikać unowned:
- Jeśli cykl życia obiektu nie gwarantuje, że odwołanie zawsze będzie ważne.
- W złożonych wzajemnych odwołaniach, gdzie kolejność zwalniania obiektów nie jest oczywista.
W takich przypadkach lepiej użyć weak, który automatycznie staje się nil, zapobiegając awaryjnemu zakończeniu.
Przykład:
class A {
unowned var b: B
init(b: B) { self.b = b }
}
class B {
var a: A?
}
Jeśli obiekt B zostanie zwolniony wcześniej niż A, odwołanie do b w A spowoduje błąd.