Middle
Kādi saites ir sitetable objektā?
sobes.tech AI
Atbilde no AI
Spēcīgas (strong), vājas (weak), bez īpašnieka (unowned).
- Spēcīga: Izveido īpašumu objektam, novēršot tā deallokāciju, kamēr ir spēcīgas atsauces.
- Vāja: Neizveido īpašumu. Ja objekts, uz kuru atsaucas vāja atsauce, tiek deallokēts, vāja atsauce automātiski kļūst par nil. To izmanto, lai novērstu spēcīgu atsauču ciklus, bieži uz vecāka objekta vai deleģenta atsaucēm.
- Bez īpašnieka: Neizveido īpašumu. Līdzīgs vājam atsaucei, bet garantē, ka objekts, uz kuru atsaucas, pastāvēs visu dzīves cikla laikā bez īpašnieka atsauces. Ja mēģināsiet piekļūt objektam pēc tā deallokācijas, notiks kļūda (crash). To izmanto, ja objektiem ir vienāds vai saistīts dzīves cikls, un nil ir atļauts, bet negaidīts.
// Piemērs Spēcīgs
class Parent {
var child: Child?
}
class Child {
var parent: Parent?
}
var parent: Parent? = Parent()
var child: Child? = Child()
parent?.child = child
child?.parent = parent // Izveido spēcīgu atsauču ciklu
parent = nil // Parent netiks deallokēts, jo ir spēcīga atsauce no child
child = nil // Child netiks deallokēts, jo ir spēcīga atsauce no parent
// Piemērs Vājš
class ParentWeak {
var child: ChildWeak?
}
class ChildWeak {
weak var parent: ParentWeak? // Vāja atsauce
deinit {
print("ChildWeak deallocated")
}
}
var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()
parentWeak?.child = childWeak
childWeak?.parent = parentWeak
parentWeak = nil // ParentWeak deallocated
// ChildWeak deallocated
// Piemērs Bez īpašnieka
class ParentUnowned {
var child: ChildUnowned?
}
class ChildUnowned {
unowned var parent: ParentUnowned // Bez īpašnieka atsauce
init(parent: ParentUnowned) {
self.parent = parent
}
deinit {
print("ChildUnowned deallocated")
}
}
var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned ir jāpastāv
parentUnowned?.child = childUnowned
parentUnowned = nil // ParentUnowned deallocated, ChildUnowned deallocated