Sobes.tech
Middle

Ի՞նչ հղումներ կան sitetable օբյեկտում։

sobes.tech AI

Պատասխան AI-ից

Հզոր (strong), թույլ (weak), առանց սեփականատիրոջ (unowned):

  • Հզոր: Ստեղծում է օբյեկտի տիրապետում, կանխում է նրա deallocation-ը, քանի դեռ կան հզոր հղումներ:
  • Թույլ: Չի ստեղծում տիրապետում: Եթե այն օբյեկտը, որի վրա հղում է թույլ հղումը, deallocate է, թույլ հղումը ավտոմատապես դառնում է nil: Օգտագործվում է հզոր հղումների ցիկլերը կանխելու համար, հաճախ՝ ծնողի կամ դելեգատի հղումների համար:
  • Անվлад: Չի ստեղծում տիրապետում: Դիպուկ է թույլ հղման նման, բայց երաշխավորում է, որ այն օբյեկտը, որի վրա հղում է, կշարունակի գոյություն ունենալ ամբողջ կյանքի ընթացքում առանցվлад հղումով: Եթե փորձեք մուտք գործել օբյեկտին նրա deallocate-ից հետո, տեղի կունենա սխալ (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 չի լինի deallocated՝ հզոր հղումից հետո
child = nil // Child չի լինի deallocated՝ հզոր հղումից հետո

// Օրինակ Թույլ
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Թույլ հղում

    deinit {
        print("ChildWeak deallocated")
    }
}

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

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

parentWeak = nil // ParentWeak deallocated
// ChildWeak deallocated

// Օրինակ Անվлад
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Անվлад հղում

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

    deinit {
        print("ChildUnowned deallocated")
    }
}

var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned պետք է գոյություն ունենա

parentUnowned?.child = childUnowned

parentUnowned = nil // ParentUnowned deallocated, ChildUnowned deallocated