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
releaseyokideallocbilan 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.