Junior — Middle
Czym różnią się od siebie odwołania typu Weak i Unowned w zarządzaniu pamięcią?
sobes.tech AI
Odpowiedź od AI
W Swift, odwołania typu weak i unowned są używane do zapobiegania cyklom silnych odwołań (cyklom zatrzymania) podczas zarządzania pamięcią, ale różnią się pod względem zachowania i zastosowania.
-
Weak (słabe odwołanie):
- Może być
nil. - Deklaruje się jako typ opcjonalny (
var delegate: SomeDelegate? weak). - Używa się go, gdy odwołanie może stać się
nilw trakcie życia obiektu, na przykład delegaci. - System automatycznie ustawia odwołanie
weaknanil, gdy obiekt, na który się odwołuje, zostanie zwolniony.
- Może być
-
Unowned (bez właściciela):
- Nie może być
nil(typ nie opcjonalny). - Używa się go, gdy odwołanie istnieje gwarantowanie przez cały czas życia obiektu, na przykład, między rodzicem a dzieckiem.
- Jeśli obiekt, na który się odwołuje
unowned, zostanie już zwolniony, próba dostępu spowoduje błąd w czasie wykonywania (crash).
- Nie może być
Przykład:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Tutaj, tenant jest `unowned`, ponieważ mieszkanie nie może istnieć bez najemcy.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// Delegat jest `weak`, ponieważ może zostać zwolniony wcześniej.
Zatem, weak jest odpowiedni dla odwołań, które mogą stać się nil, a unowned dla odwołań, które muszą zawsze być ważne podczas życia obiektu.