Junior
Qayta ishlashni qanday ishlaydi?
sobes.tech AI
AIdan javob
iOS/macOS dasturlash kontekstida, Swift/Objective-C garbage collector (GC) emas, balki avtomatik murojaat hisoblash (Automatic Reference Counting, ARC) ni ishlatadi.
ARC har bir sinf nusxasiga (va yopilishlar bilan tutashgan holda) kuchli murojaatlarning sonini hisoblab, avtomatik ravishda xotirani boshqaradi. Kuchli murojaatlar soni nolga teng bo'lsa, tizim ob'ekt tomonidan egallangan xotirani bo'shatadi.
ARC ning asosiy nuqtalari:
- Kuchli murojaatlar (Strong): Murojaat sonini oshiradi. Ob'ekt kamida bitta kuchli murojaat bo'lsa, xotirada qoladi.
- Zaif murojaatlar (Weak): Murojaat sonini oshirmaydi. Kuchli murojaat aylanishlarini oldini olish uchun ishlatiladi. Opsional ob'ektga murojaat qiladi va ob'ekt bo'shatilganda nil bo'ladi.
- Noma'lum murojaatlar (Unowned): Murojaat sonini oshirmaydi. Ob'ektlarning hayot aylanishi ma'lum bo'lsa va bir ob'ekt doimo boshqasining mavjudligi bilan mavjud bo'lsa ishlatiladi. Murojaat opsional emas. Agar unowned murojaat qilgan ob'ekt bo'shatilsa, unga kirish xatolik bilan tugaydi.
ARC kompilatsiya vaqtida ishlaydi, va mos kodga retain (sonni oshirish) va release (sonni kamaytirish) chaqiriqlarini qo'shadi.
class MyClass {
var prop: String = ""
}
var reference1: MyClass? = MyClass() // Son = 1
var reference2 = reference1 // Son = 2
reference1 = nil // Son = 1
reference2 = nil // Son = 0, ob'ekt bo'shatiladi
class Person {
let name: String
weak var apartment: Apartment? // Zaif murojaat, aylanishlarni oldini olish uchun
init(name: String) { self.name = name; print("\(name) boshlanmoqda") }
deinit { print("\(name) tugatilmoqda") }
}
class Apartment {
let unit: String
unowned var tenant: Person // Noma'lum murojaat
init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Xonadon \(unit) boshlanmoqda") }
deinit { print("Xonadon \(unit) tugatilmoqda") }
}