Sobes.tech
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 nil bo'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.