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 // Parent деаллокацияланбайт, себеби күчтүү шилтеме бар
child = nil // Child деаллокацияланбайт, себеби күчтүү шилтеме бар

// Мисал алсыз
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 // ParentWeak деаллокацияланды
// ChildWeak деаллокацияланды

// Мисал менчиксиз
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 деаллокацияланды