Sobes.tech
Junior

Tullantı toplayıcısı (garbage collector) necə işləyir?

sobes.tech Süni İntellekt

AI-dan cavab

iOS/macOS inkişaf kontekstində, Swift/Objective-C çöp toplayıcı (GC) istifadə etmir, əvəzinə avtomatik istinad sayımı (Automatic Reference Counting, ARC) istifadə edir.

ARC hər bir sinif nümunəsinə (və tutma ilə bağlı bağlamalarla) güclü istinadların (Strong) sayını sayır. Güclü istinadların sayı sıfıra çatanda, sistem obyekt tərəfindən istifadə olunan yaddaşı azad edir.

ARC-nin əsas nöqtələri:

  • Güclü istinadlar (Strong): İstinad sayını artırır. Obyekt, ən azı bir güclü istinad olduğu müddətdə yaddaşda qalır.
  • Zəif istinadlar (Weak): İstinad sayını artırmır. Güclü istinad döngülərini qarşısını almaq üçün istifadə olunur. Opsional obyektə istinad edir və obyekt azad ediləndə nil olur.
  • Müəyyən olmayan istinadlar (Unowned): İstinad sayını artırmır. Obyektlərin həyat dövrü məlumdursa və bir obyekt həmişə digərinin mövcudluğu ilə mövcuddursa istifadə olunur. İstinad opsional deyil. Əgər unowned ilə istinad edilən obyekt azad edilərsə, ona giriş zamanı icra zamanı səhv baş verər.

ARC tərtib zamanı işləyir və uyğun kodda retain (sayını artırmaq) və release (sayını azaltmaq) çağırışlarını yerləşdirir.

class MyClass {  
    var prop: String = ""  
}

var reference1: MyClass? = MyClass() // Say = 1
var reference2 = reference1 // Say = 2

reference1 = nil // Say = 1
reference2 = nil // Say = 0, obyekt azad edilir
class Person {  
    let name: String
    weak var apartment: Apartment? // Zəif istinad, döngünü qarşısını almaq üçün
    init(name: String) { self.name = name; print("\(name) başlanır") }
    deinit { print("\(name) deinitialization") }
}

class Apartment {  
    let unit: String
    unowned var tenant: Person // Müəyyən olmayan istinad
    init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Mənzil \(unit) başlanır") }
    deinit { print("Mənzil \(unit) deinitialization") }
}