Sobes.tech
Junior

Zaif va kuchli havolalar o'rtasidagi farq nima?

sobes.tech AI

AIdan javob

Xotira boshqaruvi mexanizmidagi (ARC - Avtomatik Referenslar Hisobi) farqi.

  • Kuchli referens (Strong reference): Ob'ektning referenslar hisoblagichini 1 ga oshiradi. Ob'ekt kamida bitta kuchli referensga ega bo'lsa, u xotiradan ozod qilinmaydi. Bu Swift'da xususiyatlar va o'zgaruvchilar uchun standart xulq.

  • Zaif referens (Weak reference): Ob'ektning referenslar hisoblagichini oshirmaydi. Bu siklik referenslarni oldini olish uchun ishlatiladi, ikki yoki undan ortiq ob'ekt bir-biriga kuchli referenslarga ega bo'lsa, xotira oqib ketadi. Zaif referenslar har doim opsional (Optional) bo'lib, ular referens qilayotgan ob'ekt har qanday vaqtda ozod qilinishi mumkin. Ob'ekt ozod qilinganida, zaif referens avtomatik ravishda nil bo'ladi.

Siklik referens va uning zaif referens yordamida oldini olish misoli:

class Person {
    let name: String
    var apartment: Apartment? // Boshlang'ichda kuchli referens
    init(name: String) { self.name = name }
    deinit { print("\(name) ozod qilinmoqda") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Zaif referens
    init(unit: String) { self.unit = unit }
    deinit { print("Xonadon \(unit) ozod qilinmoqda") }
}

var john: Person? // Person ob'ekti
var unit4A: Apartment? // Apartment ob'ekti

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

// Kuchli referens sikli yaratish:
// john xonadonga kuchli referens tutadi
// xonadon, odamga kuchli referens tutadi
john!.apartment = unit4A
unit4A!.tenant = john // Bu zaif bo'lishi kerak, siklni to'xtatish uchun

john = nil // Nilga sozlash sikl mavjud bo'lsa, ozod qilmaydi
unit4A = nil // Nilga sozlash sikl mavjud bo'lsa, ozod qilmaydi

// Zaif referens bilan tenant uchun kutilgan chiqish:
// John Appleseed ozod qilinmoqda
// Xonadon 4A ozod qilinmoqda

weak bo'lmasa, tenant uchun, destruktorlar chaqirilmaydi, bu xotira oqib ketishini ko'rsatadi.