Middle
Milyen linkek vannak a sitetable objektumban?
sobes.tech MI
Válasz az MI-től
Erős (strong), gyenge (weak), tulajdon nélküli (unowned).
- Erős: Létrehozza az objektum tulajdonjogát, és megakadályozza annak deallokálását, amíg erős hivatkozások léteznek.
- Gyenge: Nem hoz létre tulajdonjogot. Ha a gyenge hivatkozás által hivatkozott objektum deallocálódik, a gyenge hivatkozás automatikusan nil lesz. Gyakran használják erős hivatkozási ciklusok elkerülésére, például szülő vagy delegált hivatkozásoknál.
- Tulajdon nélküli: Nem hoz létre tulajdonjogot. Hasonló a gyenge hivatkozáshoz, de garantálja, hogy a hivatkozott objektum az egész életciklusa alatt létezik tulajdon nélkül. Ha a deallocálás után próbál hozzáférni az objektumhoz, futási hiba (crash) lép fel. Akkor használják, ha az objektumok hasonló vagy összefüggő életciklussal rendelkeznek, és a nil elfogadható, de nem elvárt.
// Erős példa
class Parent {
var child: Child?
}
class Child {
var parent: Parent?
}
var parent: Parent? = Parent()
var child: Child? = Child()
parent?.child = child
child?.parent = parent // Erős hivatkozási ciklus létrehozása
parent = nil // A szülő nem lesz deallocálva a child erős hivatkozása miatt
child = nil // A gyermek nem lesz deallocálva a szülő erős hivatkozása miatt
// Gyenge példa
class ParentWeak {
var child: ChildWeak?
}
class ChildWeak {
weak var parent: ParentWeak? // Gyenge hivatkozás
deinit {
print("ChildWeak deallocálva")
}
}
var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()
parentWeak?.child = childWeak
childWeak?.parent = parentWeak
parentWeak = nil // A szülő deallocálódik
// A gyermek deallocálódik
// Tulajdon nélküli példa
class ParentUnowned {
var child: ChildUnowned?
}
class ChildUnowned {
unowned var parent: ParentUnowned // Tulajdon nélküli hivatkozás
init(parent: ParentUnowned) {
self.parent = parent
}
deinit {
print("ChildUnowned deallocálva")
}
}
var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // A ParentUnowned léteznie kell
parentUnowned?.child = childUnowned
parentUnowned = nil // A ParentUnowned és a ChildUnowned deallocálódik