Sobes.tech
Middle

Jaké odkazy jsou v objektu sitetable?

sobes.tech AI

Odpověď od AI

Silné (strong), slabé (weak), bez vlastnictví (unowned).

  • Silné: Vytváří vlastnictví objektu a zabraňuje jeho uvolnění, dokud existují silné odkazy.
  • Slabé: Nevytváří vlastnictví. Pokud je objekt, na který odkazuje slabý odkaz, uvolněn, slabý odkaz se automaticky nastaví na nil. Používá se k prevenci cyklů silných odkazů, často pro odkazy na rodičovský objekt nebo delegáta.
  • Bez vlastnictví: Nevytváří vlastnictví. Podobně jako slabý odkaz, ale zaručuje, že odkazovaný objekt bude existovat po celou dobu svého životního cyklu bez vlastnictví. Pokud se pokusíte přistoupit k objektu po jeho uvolnění, dojde k chybě za běhu (crash). Používá se, když objekty mají podobný nebo propojený životní cyklus a nil je přijatelný, ale neočekávaný.
// Příklad silného
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áří cyklus silných odkazů

parent = nil // Rodič nebude uvolněn kvůli silnému odkazu od dítěte
child = nil // Dítě nebude uvolněno kvůli silnému odkazu od rodiče

// Příklad slabého
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Slabý odkaz

    deinit {
        print("ChildWeak uvolněn")
    }
}

var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()

parentWeak?.child = childWeak
childWeak?.parent = parentWeak

parentWeak = nil // ParentWeak uvolněn
// ChildWeak uvolněn

// Příklad bez vlastnictví
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Bez vlastnictví

    init(parent: ParentUnowned) {
        self.parent = parent
    }

    deinit {
        print("ChildUnowned uvolněn")
    }
}

var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned musí existovat

parentUnowned?.child = childUnowned

parentUnowned = nil // ParentUnowned a ChildUnowned jsou uvolněny