Junior
iOS'ta ARC (Otomatik Referans Sayımı) nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
ARC, iOS'ta bellek yönetim mekanizmasıdır ve nesnelere referans sayımını otomatik olarak takip eder. Bir nesneye olan referans sayısı sıfıra düştüğünde, ARC otomatik olarak bu nesnenin kapladığı belleği serbest bırakır.
ARC'nin avantajları:
- Bellek sızıntılarının azaltılması: Belleğin serbest bırakılma sürecinin otomatikleştirilmesi, unutulan
releaseveyadeallochatası olasılığını azaltır. - Çift serbest bırakmadan kaynaklanan çökme riskinin azaltılması: ARC, zaten serbest bırakılmış belleğin tekrar serbest bırakılmaya çalışılmasını engeller.
- Kodu basitleştirme: Geliştirici, belleği manuel olarak yönetmek zorunda kalmaz, bu da kodu daha temiz ve anlaşılır kılar.
Otomasyonuna rağmen, ARC kullanırken güçlü ve zayıf referans kavramlarını anlamak önemlidir, böylece güçlü referans döngüleri (retain cycles) önlenebilir.
Güçlü referans örneği:
class Person {
var name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) başlatılıyor")
}
deinit {
print("\(name) sonlandırılıyor")
}
}
class Apartment {
var unit: String
var tenant: Person? // Güçlü referans
init(unit: String) {
self.unit = unit
print("Daire \(unit) başlatılıyor")
}
deinit {
print("Daire \(unit) sonlandırılıyor")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Her iki tarafta güçlü referans oluşturma
john!.apartment = unit4A
unit4A!.tenant = john
// Referansların sıfırlanması döngüye neden olmaz
john = nil
unit4A = nil
Döngüyü kırmak için zayıf referans kullanımı örneği:
class Person {
var name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) başlatılıyor")
}
deinit {
print("\(name) sonlandırılıyor")
}
}
class Apartment {
var 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) sonlandırılıyor")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
// Referansların sıfırlanması döngüyü kırar (deinit çağrılır)
john = nil // Person sonlandırıldı
unit4A = nil // Apartment sonlandırıldı
ARC, sınıf nesnelerine uygulanır. Yapılar ve enumlar değer tipleridir ve otomatik bellek yönetimine tabi değildirler.