Sobes.tech
Junior

iOS'da ARC (Avtomatik Referenslar Hisobi) nima?

sobes.tech AI

AIdan javob

ARC — bu iOS-da xotira boshqaruvi mexanizmi bo‘lib, u avtomatik ravishda ob'ektlarga bo‘lgan murojaatlarni hisoblaydi. Ob'ektga bo‘lgan murojaatlar soni nolga teng bo‘lsa, ARC avtomatik ravishda ushbu ob'ekt tomonidan egallangan xotirani bo‘shatadi.

ARC ning afzalliklari:

  • Xotira oqib ketishining oldini olish: Xotira bo‘shatilishini avtomatlashtirish, unutib qo‘yilgan release yoki dealloc bilan bog‘liq xatolik ehtimolini kamaytiradi.
  • Ikki marta bo‘shatish natijasida yuzaga keladigan avariyalarni oldini olish: ARC, allaqachon bo‘shatilgan xotirani yana bo‘shatishga urinishlarni oldini oladi.
  • Kodni soddalashtirish: Dasturchi xotirani qo‘lda boshqarishi shart emas, bu esa kodni toza va tushunarli qiladi.

Avtomatlashtirishga qaramay, ARC bilan ishlashda kuchli va zaif murojaat tushunchalarini tushunish muhim, shunda kuchli murojaat aylanishlari (retain cycles) oldi olinadi.

Kuchli murojaat misoli:

class Person {
    var name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) boshlanmoqda")
    }

    deinit {
        print("\(name) tugatilmoqda")
    }
}

class Apartment {
    var unit: String
    var tenant: Person? // Kuchli murojaat

    init(unit: String) {
        self.unit = unit
        print("Xonadon \(unit) boshlanmoqda")
    }

    deinit {
        print("Xonadon \(unit) tugatilmoqda")
    }
}

var john: Person?
var unit4A: Apartment?

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

// Har ikki tomon uchun kuchli murojaat yaratish
john!.apartment = unit4A
unit4A!.tenant = john

// Murojaatlarni null qilish, deinit ga olib kelmaydi, chunki aylanish mavjud
john = nil
unit4A = nil

Aylanishni buzish uchun zaif murojaatdan foydalanish misoli:

class Person {
    var name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) boshlanmoqda")
    }

    deinit {
        print("\(name) tugatilmoqda")
    }
}

class Apartment {
    var unit: String
    weak var tenant: Person? // Zaif murojaat

    init(unit: String) {
        self.unit = unit
        print("Xonadon \(unit) boshlanmoqda")
    }

    deinit {
        print("Xonadon \(unit) tugatilmoqda")
    }
}

var john: Person?
var unit4A: Apartment?

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

john!.apartment = unit4A
unit4A!.tenant = john

// Murojaatlarni null qilish aylanishni buzadi (deinit)
john = nil // Person tugatilmoqda
unit4A = nil // Apartment tugatilmoqda

ARC sinflar ob'ektlariga tatbiq etiladi. Strukturalar va enumeratsiyalar qiymat turlaridir va avtomatik xotira boshqaruviga ega emaslar.