W jakich przypadkach lepiej stosować unowned zamiast weak w zarządzaniu pamięcią?
sobes.tech AI
Odpowiedź od AI
W Swift, weak i unowned są używane do zapobiegania cyklom silnych referencji, ale stosuje się je w różnych sytuacjach:
-
weakto opcjonalne odniesienie, które automatycznie staje sięnil, gdy obiekt, na który się odwołuje, zostanie zwolniony. Używa się go, gdy odniesienie może stać sięnilw trakcie życia obiektu. -
unownedto nieoptymalne odniesienie, które zakłada, że obiekt, na który się odwołuje, zawsze będzie istniał podczas korzystania z tego odniesienia. Jeśli obiekt zostanie zwolniony, dostęp dounownedspowoduje błąd w czasie wykonywania.
Preferuje się używanie unowned, gdy:
- Odniesienie zawsze musi wskazywać na istniejący obiekt (np. rodzic, który żyje dłużej niż dziecko).
- Masz pewność, że czas życia obiektu, na który się odwołujesz, nie będzie krótszy niż czas życia odniesienia.
Przykład:
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
}
let john = Customer(name: "John Appleseed")
john.card = CreditCard(number: 1234_5678_9012_3456, customer: john)
Tutaj, CreditCard ma nieoptymalne odniesienie unowned do Customer, ponieważ karta nie może istnieć bez klienta, a klient żyje dłużej niż karta.