Junior — Middle
Care este diferența dintre referințele de tip Weak și Unowned în gestionarea memoriei?
sobes.tech AI
Răspuns de la AI
În Swift, referințele de tip weak și unowned sunt utilizate pentru a preveni ciclurile de referințe puternice (cicluri de retenție) în gestionarea memoriei, dar diferă în comportament și aplicare.
-
Weak (referință slabă):
- Poate fi
nil. - Este declarată ca un tip opțional (
var delegate: SomeDelegate? weak). - Este utilizată atunci când referința poate deveni
nilpe parcursul vieții obiectului, de exemplu, delegați. - Sistemul setează automat referința
weaklanilatunci când obiectul referențiat este eliberat.
- Poate fi
-
Unowned (fără proprietar):
- Nu poate fi
nil(tip non-opțional). - Este utilizată atunci când referința există garantat pe durata vieții obiectului, de exemplu, între un părinte și un copil.
- Dacă obiectul referențiat de
unowneda fost deja eliberat, o încercare de acces va duce la o eroare în timpul execuției (crash).
- Nu poate fi
Exemplu:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Aici, `tenant` este un `unowned`, deoarece un apartament nu poate exista fără un chiriaș.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// Delegatul este `weak`, deoarece poate fi eliberat mai devreme.
Prin urmare, weak este potrivit pentru referințe care pot deveni nil, iar unowned pentru referințe care trebuie să fie întotdeauna valide pe durata vieții obiectului.