Sobes.tech
Middle

Ulanishlar avtomatik hisoblash nima?

sobes.tech AI

AIdan javob

Avtomatik referenslar soni (Automatic Reference Counting, ARC) Swift va Objective-C tillarida xotira boshqaruv mexanizmi bo'lib, u ob'ektlarga ajratilgan xotirani avtomatik ravishda kuzatadi va bo'shatadi. Har bir sinf nusxasining referenslar soni bo'lib, u ob'ektga kuchli referens yaratilganda oshadi va olib tashlanganda kamayadi. Referenslar soni nolga teng bo'lsa, ARC ob'ektni avtomatik ravishda de-allocate qiladi va uning xotirasini bo'shatadi.

ARC xotira oqibati va ikki marta bo'shatishni oldini oladi, xotira boshqaruvini qo'lda qilishga nisbatan soddalashtiradi (masalan, Objective-C da ARC bo'lmagan holatda).

Uch turdagi referenslar mavjud:

  1. Strong (Kuchli): Ob'ektning referenslar sonini oshiradi. Bu standart referens turi.
  2. Weak (Zaif): Referenslar sonini oshirmaydi. Ikki ob'ekt o'zaro kuchli referenslar bilan bog'langanida, siklni oldini olish uchun ishlatiladi. Zaif referens ob'ekt de-allocate qilinsa, nil bo'ladi. weak kalit so'zi bilan aniqlanadi.
  3. Unowned (Egasi bo'lmagan): Referenslar sonini oshirmaydi va har doim qiymatga ega. Ob'ekt har doim mavjud bo'lsa, unga doimiy ravishda murojaat qilish uchun ishlatiladi. weak ga qaraganda, unowned referens nil bo'lmaydi va ob'ektga kirishga urinishda xato yuzaga kelishi mumkin. unowned kalit so'zi bilan aniqlanadi.

Kuchli referenslar sikli misoli:

class Human {
    let name: String
    var apartment: Apartment? // Opsional Apartmentga kuchli referens
    init(name: String) {
        self.name = name
        print("\(name) boshlanmoqda")
    }
    deinit {
        print("\(name) tugatilmoqda")
    }
}

class Apartment {
    let unit: String
    var tenant: Human? // Opsional Humanga kuchli referens
    init(unit: String) {
        self.unit = unit
        print("Yashash joyi \(unit) boshlanmoqda")
    }
    deinit {
        print("Yashash joyi \(unit) tugatilmoqda")
    }
}

var john: Human?
var unit4A: Apartment?

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

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

john = nil
unit4A = nil
// Kuchli referenslar sikli tufayli "John Appleseed tugatilmoqda" yoki "Yashash joyi 4A tugatilmoqda" chiqarilmaydi.

weak yordamida kuchli referenslar siklini hal qilish:

class Human {
    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: Human? // Zaif referens
    init(unit: String) {
        self.unit = unit
        print("Yashash joyi \(unit) boshlanmoqda")
    }
    deinit {
        print("Yashash joyi \(unit) tugatilmoqda")
    }
}

var john: Human?
var unit4A: Apartment?

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

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

john = nil // John de-allocate qilinadi, chunki uning referenslar soni 0
unit4A = nil // Apartment de-allocate qilinadi, chunki uning referenslar soni 0