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") }
}