Sobes.tech
Middle

Какви връзки има в обекта sitetable?

sobes.tech AI

Отговор от AI

Здрави (strong), слаби (weak), без собственик (unowned).

  • Здрав: Създава притежание на обекта и предотвратява неговото освобождаване, докато съществуват силни препратки.
  • Слаби: Не създава притежание. Ако обектът, към който сочи слаба препратка, бъде освободен, слабото препратка автоматично става nil. Използва се за предотвратяване на цикли на силни препратки, често към родителски обект или делегат.
  • Без собственик: Не създава притежание. Подобно на слаба препратка, но гарантира, че обектът, към който сочи, ще съществува през целия си жизнен цикъл без собственик. Ако се опитате да получите достъп до обекта след неговото освобождаване, ще настъпи грешка при изпълнение (crash). Използва се, когато обектите имат подобен или свързан жизнен цикъл, и nil е допустимо, но не се очаква.
// Пример за Здрав
class Parent {
    var child: Child?
}

class Child {
    var parent: Parent?
}

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

parent?.child = child
child?.parent = parent // Създава цикъл от силни препратки

parent = nil // Родителят няма да бъде освободен заради силната препратка от child
child = nil // Детето няма да бъде освободено заради силната препратка от parent

// Пример за Слаб
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Слаба препратка

    deinit {
        print("ChildWeak освободен")
    }
}

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

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

parentWeak = nil // Родителят е освободен
// Детето е освободено

// Пример без собственик
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Без собственик

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

    deinit {
        print("ChildUnowned освободен")
    }
}

var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned трябва да съществува

parentUnowned?.child = childUnowned

parentUnowned = nil // ParentUnowned и ChildUnowned са освободени