Middle
iOS'dagi xotira boshqaruvi haqida gapiring.
sobes.tech AI
AIdan javob
iOS avtomatik ravishda xotira boshqaruvi uchun referensiya hisoblash (ARC) dan foydalanadi. ARC, ob'ektlar ular uchun murojaat qilinishdan to'xtagan zahoti avtomatik ravishda bo'shatadi.
Asosiy tushunchalar:
- Kuchli murojaat: Ob'ektning murojaatlar hisoblagichini oshiradi. Ob'ekt, kuchli murojaatlar bo'lmaguncha, bo'shatilmaydi.
- Zaif murojaat: Murojaatlar hisoblagichini oshirmaydi. Kuchli aylantirishlarni oldini olish uchun ishlatiladi. Ob'ektga murojaat qiladi, u bo'shatilishi mumkin. Agar ob'ekt bo'shatilsa, zaif murojaat
nilbo'ladi. - Nafaqat egasi bo'lmagan murojaat (unowned): Zaifga o'xshash, hisoblagichni oshirmaydi. Ob'ektning hayot aylanishi teng yoki undan uzoq bo'lsa, ishlatiladi. Unowned murojaat ob'ekt bo'shatilganda
nilbo'lmaydi. Bo'shatilgan ob'ektga unowned murojaat orqali kirishga urinish xatolik keltirib chiqaradi.
Kuchli murojaat aylanishlari (Retain Cycles): Ikki yoki undan ortiq ob'ektlar bir-biriga kuchli murojaat bilan murojaat qilganda yuzaga keladi va bo'shatilishini oldini oladi. Zaif yoki unowned murojaatlar bilan hal qilinadi.
Misol:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) boshlanmoqda")
}
deinit {
print("\(name) tugatilmoqda")
}
}
class Apartment {
let unit: String
var tenant: Person? // Kuchli murojaat, aylanishga olib keladi
init(unit: String) {
self.unit = unit
print("Xonadon \(unit) boshlanmoqda")
}
deinit {
print("Xonadon \(unit) tugatilmoqda")
}
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // Bu yerda aylanish yuzaga keladi
john = nil
unit4A = nil
// Deinitializer metodlari chaqirilmaydi, aylanish sababli
weak dan foydalanish bilan yechim:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) boshlanmoqda")
}
deinit {
print("\(name) tugatilmoqda")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // Kuchli aylanishni oldini olish uchun weak murojaat
init(unit: String) {
self.unit = unit
print("Xonadon \(unit) boshlanmoqda")
}
deinit {
print("Xonadon \(unit) tugatilmoqda")
}
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
unit4A = nil
// Ikkala ob'ekt ham to'g'ri tarzda tugatiladi
Unowned va Weak:
weakni ishlating, murojaatnilbo'lishi mumkin bo'lsa (ob'ekt birinchi bo'lib bo'shatilishi mumkin).unownedni ishlating, murojaat har doim qiymatga ega bo'lsa (murojaat qilinayotgan ob'ektning hayot aylanishi teng yoki undan uzoqroq).