Sobes.tech
Middle

Welche Links gibt es im Objekt sitetable?

sobes.tech KI

Antwort von AI

Stark (strong), schwach (weak), unbesessen (unowned).

  • Stark: Erzeugt den Besitz des Objekts und verhindert dessen Deallokation, solange starke Referenzen bestehen.
  • Schwach: Erzeugt keinen Besitz. Wenn das Objekt, auf das sich die schwache Referenz bezieht, deallokiert wird, wird die schwache Referenz automatisch nil. Wird verwendet, um Zyklen starker Referenzen zu vermeiden, oft für Referenzen auf das Elternobjekt oder Delegierte.
  • Unbesessen: Erzeugt keinen Besitz. Ähnlich wie die schwache Referenz, aber garantiert, dass das referenzierte Objekt während seines gesamten Lebenszyklus existiert, ohne Besitz. Wenn versucht wird, nach der Deallokation auf das Objekt zuzugreifen, tritt ein Laufzeitfehler (Crash) auf. Wird verwendet, wenn Objekte einen ähnlichen oder verbundenen Lebenszyklus haben und nil akzeptabel, aber nicht erwartet ist.
// Beispiel für Stark
class Parent {
    var child: Child?
}

class Child {
    var parent: Parent?
}

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

parent?.child = child
child?.parent = parent // Erzeugt einen Zyklus starker Referenzen

parent = nil // Parent wird nicht deallokiert wegen starker Referenz von child
child = nil // Child wird nicht deallokiert wegen starker Referenz von parent

// Beispiel für Schwach
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Schwache Referenz

    deinit {
        print("ChildWeak deallokiert")
    }
}

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

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

parentWeak = nil // ParentWeak deallokiert
// ChildWeak deallokiert

// Beispiel für Unbesessen
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Unbesessene Referenz

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

    deinit {
        print("ChildUnowned deallokiert")
    }
}

var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned muss existieren

parentUnowned?.child = childUnowned

parentUnowned = nil // ParentUnowned deallokiert, ChildUnowned deallokiert