Middle
Kokie nuorodai yra sitetable objekte?
sobes.tech AI
Atsakymas iš AI
Stiprus (strong), silpnas (weak), be savininko (unowned).
- Stiprus: Sukuria nuosavybę objektu, užkertant kelią jo deallokacijai, kol yra stiprios nuorodos.
- Silpnas: Nesukuria nuosavybės. Jei objektas, į kurį nukreipia silpna nuoroda, deallokuojamas, silpna nuoroda automatiškai tampa nil. Naudojama siekiant išvengti stiprių nuorodų ciklų, dažnai nuorodoms į tėvinį objektą arba delegatą.
- Be savininko: Nesukuria nuosavybės. Panaši į silpną nuorodą, bet užtikrina, kad į objektą, į kurį nukreipia, jis egzistuos viso gyvavimo ciklo metu be savininko nuorodos. Jei bandysite pasiekti objektą po jo deallokacijos, įvyks klaida (crash). Naudojama, kai objektai turi tą patį arba susijusį gyvavimo ciklą, ir nil yra leidžiama, bet ne tikimasi.
// Pavyzdys stiprus
class Parent {
var child: Child?
}
class Child {
var parent: Parent?
}
var parent: Parent? = Parent()
var child: Child? = Child()
parent?.child = child
child?.parent = parent // Sukuria stiprių nuorodų ciklą
parent = nil // Parent nebus deallokuotas dėl stiprios nuorodos iš child
child = nil // Child nebus deallokuotas dėl stiprios nuorodos iš parent
// Pavyzdys silpnas
class ParentWeak {
var child: ChildWeak?
}
class ChildWeak {
weak var parent: ParentWeak? // Silpna nuoroda
deinit {
print("ChildWeak deallocated")
}
}
var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()
parentWeak?.child = childWeak
childWeak?.parent = parentWeak
parentWeak = nil // ParentWeak deallocated
// ChildWeak deallocated
// Pavyzdys be savininko
class ParentUnowned {
var child: ChildUnowned?
}
class ChildUnowned {
unowned var parent: ParentUnowned // Be savininko nuoroda
init(parent: ParentUnowned) {
self.parent = parent
}
deinit {
print("ChildUnowned deallocated")
}
}
var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned turi egzistuoti
parentUnowned?.child = childUnowned
parentUnowned = nil // ParentUnowned deallocated, ChildUnowned deallocated