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:
- Strong (Kuchli): Ob'ektning referenslar sonini oshiradi. Bu standart referens turi.
- 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,
nilbo'ladi.weakkalit so'zi bilan aniqlanadi. - 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.
weakga qaraganda,unownedreferensnilbo'lmaydi va ob'ektga kirishga urinishda xato yuzaga kelishi mumkin.unownedkalit 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