Sobes.tech
Middle

Sitetable obyekti ichida qanday bog'lanishlar mavjud?

sobes.tech AI

AIdan javob

Kuchli (strong), zaif (weak), egasi bo'lmagan (unowned).

  • Kuchli: Ob'ektni egalik qilishni yaratadi, kuchli havolalar mavjud bo'lsa, uning deallocatsiyasini oldini oladi.
  • Zaif: Egalik qilishni yaratmaydi. Zaif havola ko'rsatgan ob'ekt deallocatsiya qilinsa, zaif havola avtomatik ravishda nil bo'ladi. Kuchli havolalar aylanishlarini oldini olish uchun ishlatiladi, odatda ota-ona ob'ekti yoki delegatga havolalar uchun.
  • Egasi bo'lmagan: Egalik qilishni yaratmaydi. Zaif havolaga o'xshash, lekin ko'rsatilgan ob'ekt butun hayot davomida mavjud bo'lishini kafolatlaydi. Ob'ektga deallocatsiyadan keyin kirishga harakat qilsangiz, bajarilish vaqti xatosi (crash) yuz beradi. Ob'ektlar o'xshash yoki bog'langan hayot tsikliga ega bo'lsa va nil qabul qilinsa, lekin kutilmasa ishlatiladi.
// Kuchli misol
class Parent {
    var child: Child?
}

class Child {
    var parent: Parent?
}

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

parent?.child = child
child?.parent = parent // Kuchli havolalar aylanishini yaratadi

parent = nil // Parent, childdan kuchli havola tufayli dealloc qilinmaydi
child = nil // Child, parentdan kuchli havola tufayli dealloc qilinmaydi

// Zaif misol
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Zaif havola

    deinit {
        print("ChildWeak dealloc")
    }
}

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

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

parentWeak = nil // ParentWeak dealloc
// ChildWeak dealloc

// Egasi bo'lmagan misol
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Egasi bo'lmagan havola

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

    deinit {
        print("ChildUnowned dealloc")
    }
}

var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned mavjud bo'lishi kerak

parentUnowned?.child = childUnowned

parentUnowned = nil // ParentUnowned va ChildUnowned dealloc qilinadi