În ce cazuri este preferabil să folosiți unowned în loc de weak în gestionarea memoriei?
sobes.tech AI
Răspuns de la AI
În Swift, weak și unowned sunt folosite pentru a preveni ciclurile de referințe puternice, dar se aplică în situații diferite:
-
weakeste o referință opțională care devine automatnilatunci când obiectul la care face referire este eliberat. Este utilizată atunci când referința poate deveninilpe parcursul vieții obiectului. -
unownedeste o referință non-opțională care presupune că obiectul la care face referire va exista întotdeauna în timpul utilizării acestei referințe. Dacă obiectul este eliberat, accesareaunownedva cauza o eroare la timpul de execuție.
Se preferă utilizarea unowned atunci când:
- Referința trebuie să indice întotdeauna către un obiect existent (de exemplu, un obiect părinte care trăiește mai mult decât copilul).
- Ești sigur că durata de viață a obiectului la care faci referire nu va fi mai scurtă decât durata de viață a referinței.
Exemplu:
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)
Aici, CreditCard are o referință unowned către Customer, deoarece cardul nu poate exista fără client, iar clientul trăiește mai mult decât cardul.