Sobes.tech
Intern

Tullantı toplayıcı (garbage collector) nədir?

sobes.tech Süni İntellekt

AI-dan cavab

iOS-də ənənəvi çöp toplayıcı yoxdur. Əvəzinə, Avtomatik Referans Sayımı (ARC) mexanizmi istifadə olunur.

  • Avtomatik mexanizm: ARC obyektlərə güclü referansları avtomatik sayır.
  • Yaddaşın azad olunması: Güclü referansların sayı sıfıra çatanda, ARC ayrılmış yaddaşı azad edir.
  • Yaddaş sızmalarının qarşısını alma: Güclü, zəif və qeyri-mülkiyyətli (unowned) referansların düzgün istifadəsi yaddaş sızmalarını və güclü referans döngələrini qarşısını alır.

ARC-də referans növləri:

  • Güclü (strong): Referans sayğacını artırır. Standartdır.
  • Zəif (weak): Referans sayğacını artırmır. Ob'ekt dealloc ediləndə avtomatik nil olur. Güclü referans döngələrini qarşısını almaq üçün istifadə olunur. Seçimli tip kimi elan edilir.
  • Qeyri-mülkiyyətli (unowned): Referans sayğacını artırmır. Referans göstərilən ob'ektin, qeyri-mülkiyyətli referansın bütün həyat dövrü ərzində mövcud olacağı təmin edilir. Seçimli deyil. İki ob'ekt qarşılıqlı güclü əlaqəyə malik olduqda, lakin biri daha qısa ömürlüdürsə, istifadə olunur.

ARC-nin üstünlükləri:

  • Əvvəlcədən bilmək: Yaddaşın azad olunması, ob'ekt artıq istifadə olunmadıqda deterministik şəkildə baş verir.
  • Performans: Arxa planda işləyən çöp toplayıcı üçün əlavə xərclər yoxdur, bu da fasilələrə səbəb ola bilər.
  • Sadəlik: İnkişaf etdirici, əksər hallarda yaddaşı əl ilə idarə etməyə ehtiyac duymur, lakin referans sayğacının prinsiplərini anlamalıdır ki, sızmaları qarşısını alsın.

Güclü referans döngüsünün nümunəsi:

class Person {
    let name: String
    var apartment: Apartment? // Apartment-ə güclü referans

    init(name: String) { self.name = name }
    deinit { print("\(name) deinitialization") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Döngünü qarşısını almaq üçün zəif referans

    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 // Burada weak istifadəsi kritikdir

john = nil
unit4A = nil
// Weak tenant olmadan: Həm john, həm də unit4A deinitialization olmayacaq.
// Weak tenant ilə: Həm john, həm də unit4A düzgün şəkildə deinitialization olur.