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 ravishdanilbo'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.