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
nilolur. 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.