Sobes.tech
Junior

Çöp toplayıcı (garbage collector) nasıl çalışır?

sobes.tech yapay zeka

AI'dan gelen yanıt

iOS/macOS geliştirme bağlamında, Swift/Objective-C çöp toplayıcı (GC) kullanmaz, bunun yerine Otomatik Referans Sayımı (Automatic Reference Counting, ARC) kullanır.

ARC, belleği otomatik olarak yönetir, her sınıf örneğine (ve yakalamayla birlikte kapanışlara) güçlü referansların sayısını sayar. Güçlü referans sayısı sıfıra düştüğünde, sistem nesnenin kapladığı belleği serbest bırakır.

ARC'nin temel noktaları:

  • Güçlü Referanslar (Strong): Referans sayısını artırır. Nesne, en az bir güçlü referans kaldığı sürece bellekte kalır.
  • Zayıf Referanslar (Weak): Referans sayısını artırmaz. Güçlü referans döngülerini önlemek için kullanılır. Opsiyonel bir nesneye işaret eder ve nesne serbest bırakıldığında nil olur.
  • Sahipsiz Referanslar (Unowned): Referans sayısını artırmaz. Nesnelerin yaşam döngüsü biliniyorsa ve bir nesne her zaman diğerinin varlığıyla birlikte varsa kullanılır. Referans opsiyonel değildir. Eğer unowned ile referans verilen nesne serbest bırakılırsa, erişim hatası oluşur.

ARC, derleme aşamasında çalışır ve uygun koda retain (sayacı artırma) ve release (sayacı azaltma) çağrılarını ekler.

class MyClass {  
    var prop: String = ""  
}

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

reference1 = nil // Sayı = 1
reference2 = nil // Sayı = 0, nesne serbest bırakılır
class Person {  
    let name: String
    weak var apartment: Apartment? // Zayıf referans, döngüyü önlemek için
    init(name: String) { self.name = name; print("\(name) başlatılıyor") }
    deinit { print("\(name) yok ediliyor") }
}

class Apartment {  
    let unit: String
    unowned var tenant: Person // Sahipsiz referans
    init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Daire \(unit) başlatılıyor") }
    deinit { print("Daire \(unit) yok ediliyor") }
}