Sobes.tech
Intern

Çöp toplayıcı (garbage collector) nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

iOS'ta geleneksel bir çöp toplayıcı yoktur. Bunun yerine, Otomatik Referans Sayımı (ARC) mekanizması kullanılır.

  • Otomatik mekanizma: ARC, nesnelere güçlü referansları otomatik olarak sayar.
  • Bellek serbest bırakma: Bir nesneye olan güçlü referans sayısı sıfıra ulaştığında, ARC tahsis edilen belleği serbest bırakır.
  • Kaçakların önlenmesi: Güçlü, zayıf ve sahip olmayan (unowned) referansların doğru kullanımı, bellek sızıntılarını ve güçlü referans döngülerini önlemeye olanak tanır.

ARC'deki referans türleri:

  • Güçlü (strong): Referans sayacını artırır. Varsayılan.
  • Zayıf (weak): Referans sayacını artırmaz. Nesne dealloc edildiğinde otomatik olarak nil olur. Güçlü referans döngülerini önlemek için kullanılır. Opsiyonel bir tür olarak ilan edilir.
  • Sahipsiz (unowned): Referans sayacını artırmaz. Referans verilen nesnenin, sahip olmayan referansın yaşam döngüsü boyunca var olacağı garanti edilir. Opsiyonel değildir. İki nesne karşılıklı güçlü bir ilişkiye sahip olduğunda, ancak birinin yaşam döngüsü daha kısaysa kullanılır.

ARC'nin avantajları:

  • Öngörülebilirlik: Belleğin serbest bırakılması, nesne artık kullanılmadığında belirli bir şekilde gerçekleşir.
  • Performans: Arka planda çalışan çöp toplayıcıya ek maliyetler yoktur, bu da duraklamalara neden olabilir.
  • Basitlik: Geliştirici, çoğu durumda belleği manuel olarak yönetmek zorunda değildir, ancak sızıntıları önlemek için referans sayımı ilkelerini anlamalıdır.

Güçlü referans döngüsü örneği:

class Person {
    let name: String
    var apartment: Apartment? // Apartment'a güçlü referans

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

class Apartment {
    let unit: String
    weak var tenant: Person? // Döngüyü önlemek için zayıf 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 kullanımı kritiktir

john = nil
unit4A = nil
// Weak tenant olmadan: Hem john hem de unit4A deinitialization olmaz.
// Weak tenant ile: Hem john hem de unit4A doğru şekilde deinitialization olur.