Middle
Aké odkazy sú v objekte sitetable?
sobes.tech AI
Odpoveď od AI
Silné (strong), slabé (weak), bez vlastníka (unowned).
- Silné: Vytvára vlastníctvo objektu, zabraňuje jeho deallokácii, pokiaľ existujú silné odkazy.
- Slabé: nevytvára vlastníctvo. Ak je objekt, na ktorý odkazuje slabý odkaz, deallokovaný, slabý odkaz sa automaticky stáva nil. Používa sa na prevenciu cyklov silných odkazov, často na odkazy na rodičovský objekt alebo delegáta.
- Bez vlastníka: nevytvára vlastníctvo. Podobné slabému odkazu, ale zaručuje, že objekt, na ktorý odkazuje, bude existovať počas celého životného cyklu bezvlastníckeho odkazu. Ak sa pokúsite získať prístup k objektu po jeho deallokácii, dôjde k chybe behu (crash). Používa sa, keď objekty majú rovnaký alebo súvisiaci životný cyklus, a nil je prípustný, ale nečaká sa.
// Príklad Silný
class Parent {
var child: Child?
}
class Child {
var parent: Parent?
}
var parent: Parent? = Parent()
var child: Child? = Child()
parent?.child = child
child?.parent = parent // Vytvára cyklus silných odkazov
parent = nil // Parent nebude deallokovaný kvôli silnému odkazu od child
child = nil // Child nebude deallokovaný kvôli silnému odkazu od parent
// Príklad Slabý
class ParentWeak {
var child: ChildWeak?
}
class ChildWeak {
weak var parent: ParentWeak? // Slabý odkaz
deinit {
print("ChildWeak deallocated")
}
}
var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()
parentWeak?.child = childWeak
childWeak?.parent = parentWeak
parentWeak = nil // ParentWeak deallokovaný
// ChildWeak deallokovaný
// Príklad Bez vlastníka
class ParentUnowned {
var child: ChildUnowned?
}
class ChildUnowned {
unowned var parent: ParentUnowned // Bezvlastnícky odkaz
init(parent: ParentUnowned) {
self.parent = parent
}
deinit {
print("ChildUnowned deallocated")
}
}
var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned musí existovať
parentUnowned?.child = childUnowned
parentUnowned = nil // ParentUnowned deallokovaný, ChildUnowned deallokovaný