Middle
Çöp toplayıcı (garbage collector) ile otomatik bellek yönetimi (ARC) arasındaki fark nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Çöp toplayıcı, artık program tarafından kullanılmayan belleği otomatik olarak bulur ve serbest bırakır. Arka planda çalışır, yığını periyodik olarak tarar ve aktif referanslara sahip olmayan nesneleri tanımlar.
Swift ve Objective-C'de ARC (Otomatik Referans Sayımı), nesnelerin yaşamını, her nesneye güçlü referansların sayısını sayarak yönetir. Güçlü referans sayısı sıfıra ulaştığında, ARC otomatik olarak bu nesnenin kapladığı belleği serbest bırakır.
Ana farklar:
| Özellik | Çöp Toplayıcı | ARC |
|---|---|---|
| Çalışma Prensibi | Ulaşılmaz nesneleri bulma | Güçlü referans sayımını yapma |
| Serbest bırakma anı | Belirsiz, tarama sırasında | Belirli, sayacın 0 olmasıyla |
| Ek maliyetler | Program duraklamaları (toplama sırasında) | Az, sayaç değişikliklerinde |
| Tahmin edilebilirlik | Düşük | Yüksek |
| Döngüsel referanslar | Özel yaklaşımlar gerektirir (örneğin, zayıf referanslar) | weak veya unowned referansların kullanımı gerekir |
| iOS'ta kullanımı | Modern Objective-C ve Swift'te yok | Objective-C ve Swift'te ana bellek yönetimi mekanizması |
ARC'de güçlü referans döngülerini önlemek için weak kullanımı örneği:
class Person {
let name: String
var apartment: Apartment? // güçlü referans
init(name: String) {
self.name = name
print("\(name) başlatılıyor")
}
deinit {
print("\(name) yok ediliyor")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // zayıf referans
init(unit: String) {
self.unit = unit
print("Daire \(unit) başlatılıyor")
}
deinit {
print("Daire \(unit) yok ediliyor")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // zayıf referans döngüyü engeller
john = nil // Person nesnesi yok edilir
unit4A = nil // Apartment nesnesi yok edilir