Sobes.tech
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 nil bo'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 nil bo'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:

  • weak ni ishlating, murojaat nil bo'lishi mumkin bo'lsa (ob'ekt birinchi bo'lib bo'shatilishi mumkin).
  • unowned ni ishlating, murojaat har doim qiymatga ega bo'lsa (murojaat qilinayotgan ob'ektning hayot aylanishi teng yoki undan uzoqroq).