Unowned turdagi havolalar nima uchun kerak?
sobes.tech AI
AIdan javob
unowned referanslar, obyektlar o'rtasidagi siklik referanslarni (retain cycles) hal qilish uchun kerak bo'ladi, bu holda ikkala obyekt ham bir-biriga kuchli referansga ega, ammo ularning hayot aylanishi qisqaroq yoki teng bo'ladi.
unowned ishlatiladi, agar ma'lum bo'lsa, referans qilinayotgan obyekt, referansni o'z ichiga olgan obyektning hayoti davomida nil bo'lmaydi. weak bilan farqli o'laroq, unowned referansga kirishda Optional ishlatilmaydi. Agar unowned referans qilinayotgan obyekt, unowned referansga ega obyektdan oldin deallocatsiya qilinsa, crash yuz beradi.
Kapanishlarda foydalanish misoli:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) boshlanishi")
}
deinit {
print("\(name) tugatilishi")
}
}
class Apartment {
let unit: String
// Apartment Person bilan bo'lishi ma'lum bo'lganligi uchun unowned ishlatiladi
// (bu kontekstda). Person `nil` bo'lishi mumkin,
// ammo agar Apartment mavjud bo'lsa, Person ham mavjud.
unowned let tenant: Person
init(unit: String, tenant: Person) {
self.unit = unit
self.tenant = tenant
print("Kvartira \(unit) boshlanishi")
}
deinit {
print("Kvartira \(unit) tugatilishi")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
// Bu misolda, tenant `nil` bo'lishi mumkin, shuning uchun
// unowned optional ishlatiladi
unit4A = Apartment(unit: "4A", tenant: john!)
john!.apartment = unit4A
// Kuchli referanslarni uzaymiz, deallocatsiyani tekshirish uchun
john = nil
unit4A = nil
Bu misolda, Person kuchli referans bilan Apartment ga ega (var apartment: Apartment?). Apartment kuchli referans bilan Person ga ega bo'lishi mumkin, bu siklni hosil qiladi. Ammo, bu kontekstda, Apartment Personsiz mavjud bo'lishi mumkin emas (u ijaraga oladi), shuning uchun Apartment dan Person ga referans unowned qilinadi. Shunday qilib, john = nil qilinsa, Person deallocatsiya qilinadi, va natijada (kuchli referanslar bo'lmagani uchun) Apartment ham deallocatsiya qilinadi.
weak bilan asosiy farqlar:
- Hayot aylanishi:
unownedishlatiladi, agar referans qilinayotgan obyektning hayoti, referansni o'z ichiga olgan obyekt bilan bir xil yoki undan uzoq bo'lsa.weakishlatiladi, agar referans qilinayotgan obyekt, undan oldin deallocatsiya qilinishi mumkin. - Optional:
unownedoptional emas (agarunowned optionaldeb e'lon qilinmagan bo'lsa).weakhar doim Optional. - Xavfsizlik:
unownedreferensga kirish, agar obyekt allaqachon deallocatsiya qilinsa, crashga olib keladi.weakreferensga kirishnilqaytaradi.
Shunday qilib, unowned - bu non-owning (egalik qilmaydigan) referens bo'lib, u, referans qilinayotgan obyekt, unowned referensli obyekt mavjud bo'lsa, mavjud bo'lishi kafolatlangan holda ishlatiladi.