Sobes.tech
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ý