Intern
Chiqindi yig'uvchi (garbage collector) nima?
sobes.tech AI
AIdan javob
iOS'da an'anaviy chiqindixonchi mavjud emas. O'rniga, Avtomatik Referenslar Hisoblash (ARC) mexanizmi qo'llaniladi.
- Avtomatik mexanizm: ARC avtomatik ravishda ob'ektlarga kuchli havolalarni hisoblaydi.
- Xotira bo'shatish: Ob'ektga bo'lgan kuchli havolalar soni nolga teng bo'lsa, ARC ajratilgan xotirani bo'shatadi.
- Xotira oqiblarini oldini olish: Kuchli, zaif va egalik qilmaydigan (unowned) havolalarning to'g'ri ishlatilishi xotira oqiblarini va kuchli havolalar aylanasini oldini oladi.
ARC'dagi havola turlari:
- Kuchli (strong): Havola hisoblagichini oshiradi. Standart.
- Zaif (weak): Havola hisoblagichini oshirmaydi. Ob'ekt deallocatsiya qilinayotganda avtomatik ravishda
nilbo'ladi. Kuchli havolalar aylanasini oldini olish uchun ishlatiladi. Tanlovli tur sifatida e'lon qilinadi. - Egalik qilmaydigan (unowned): Havola hisoblagichini oshirmaydi. Ulangan ob'ekt, egalik qilmaydigan havola davomida mavjud bo'lishi kafolatlanadi. Tanlovli emas. Ikki ob'ekt o'zaro kuchli bog'lanishga ega bo'lsa, lekin biri qisqa muddatli bo'lsa, ishlatiladi.
ARC'ning afzalliklari:
- Oldindan aytib bo'ladiganlik: Xotira bo'shatish ob'ekt endi foydalanilmay qolganida aniqlik bilan amalga oshadi.
- Ishlash tezligi: Orqa fon chiqindixonchisi uchun qo'shimcha xarajatlar yo'q, bu to'xtashlarni keltirib chiqarishi mumkin.
- Soddalik: Dasturchi ko'p hollarda xotirani qo'lda boshqarishi shart emas, lekin havolalar hisoblash printsiplarini tushunishi va oqibatlarni oldini olishi kerak.
Kuchli havolalar aylanishining misoli:
class Person {
let name: String
var apartment: Apartment? // Apartmentga kuchli havola
init(name: String) { self.name = name }
deinit { print("\(name) deinitialization") }
}
class Apartment {
let unit: String
weak var tenant: Person? // Aylanmani oldini olish uchun zaif havola
init(unit: String) { self.unit = unit }
deinit { print("Apartment \(unit) deinitialization") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // Bu yerda weak ishlatilishi muhim
john = nil
unit4A = nil
// Weak tenant bo'lmasa: Ikkala john va unit4A deinitialization bo'lmaydi.
// Weak tenant bilan: Ikkala john va unit4A to'g'ri deinitialization qilinadi.