Sobes.tech
Middle

Jakie linki znajdują się w obiekcie sitetable?

sobes.tech AI

Odpowiedź od AI

Silne (strong), słabe (weak), bez właściciela (unowned).

  • Strong: Tworzy własność obiektu, zapobiegając jego deallokacji, dopóki istnieją silne odwołania.
  • Weak: Nie tworzy własności. Jeśli obiekt, na który wskazuje słaba referencja, zostanie zdealokowany, słaba referencja automatycznie stanie się nil. Używane do zapobiegania cyklom silnych odwołań, często dla odwołań do obiektu nadrzędnego lub delegata.
  • Unowned: Nie tworzy własności. Podobnie do słabej referencji, ale gwarantuje, że obiekt, na który się odwołuje, będzie istniał przez cały cykl życia bez właściciela. Jeśli spróbujesz uzyskać dostęp do obiektu po jego deallokacji, wystąpi błąd wykonania (crash). Używane, gdy obiekty mają podobny lub powiązany cykl życia, a nil jest akceptowalny, ale nie jest oczekiwany.
// Przykład Strong
class Parent {
    var child: Child?
}

class Child {
    var parent: Parent?
}

var parent: Parent? = Parent()
var child: Child? = Child()

parent?.child = child
child?.parent = parent // Tworzy cykl silnych odwołań

parent = nil // Parent nie zostanie zdealokowany z powodu silnego odwołania od child
child = nil // Child nie zostanie zdealokowany z powodu silnego odwołania od parent

// Przykład Weak
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Słaba referencja

    deinit {
        print("ChildWeak deallocated")
    }
}

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

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

parentWeak = nil // ParentWeak deallocated
// ChildWeak deallocated

// Przykład Unowned
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Bez właściciela

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

    deinit {
        print("ChildUnowned deallocated")
    }
}

var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned musi istnieć

parentUnowned?.child = childUnowned

parentUnowned = nil // ParentUnowned i ChildUnowned zostaną zdealokowane