Middle
Ce legături există în obiectul sitetable?
sobes.tech AI
Răspuns de la AI
Puternic (strong), slab (weak), fără proprietar (unowned).
- Puternic: Creează deținerea obiectului și împiedică deallocarea sa atâta timp cât există referințe puternice.
- Slab: Nu creează deținere. Dacă obiectul la care face referire referința slabă este deallocat, referința slabă devine automat nil. Folosit pentru prevenirea ciclurilor de referințe puternice, adesea pentru referințe la obiectul părinte sau delegat.
- Fără proprietar: Nu creează deținere. Similar cu referința slabă, dar garantează că obiectul la care face referire va exista pe durata întregului ciclu de viață fără proprietar. Dacă se încearcă accesarea obiectului după deallocare, va apărea o eroare de execuție (crash). Folosit când obiectele au un ciclu de viață similar sau legat, și nil este acceptabil, dar nu așteptat.
// Exemplu de Puternic
class Parent {
var child: Child?
}
class Child {
var parent: Parent?
}
var parent: Parent? = Parent()
var child: Child? = Child()
parent?.child = child
child?.parent = parent // Creează un ciclu de referințe puternice
parent = nil // Parent nu va fi deallocat din cauza referinței puternice de la child
child = nil // Child nu va fi deallocat din cauza referinței puternice de la parent
// Exemplu de Slab
class ParentWeak {
var child: ChildWeak?
}
class ChildWeak {
weak var parent: ParentWeak? // Referință slabă
deinit {
print("ChildWeak deallocat")
}
}
var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()
parentWeak?.child = childWeak
childWeak?.parent = parentWeak
parentWeak = nil // ParentWeak deallocat
// ChildWeak deallocat
// Exemplu de Fără proprietar
class ParentUnowned {
var child: ChildUnowned?
}
class ChildUnowned {
unowned var parent: ParentUnowned // Referință fără proprietar
init(parent: ParentUnowned) {
self.parent = parent
}
deinit {
print("ChildUnowned deallocat")
}
}
var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned trebuie să existe
parentUnowned?.child = childUnowned
parentUnowned = nil // ParentUnowned deallocat, ChildUnowned deallocat