Otomatik bağlantı sayımı nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
O Otomatik Referans Sayımı (Automatic Reference Counting, ARC), Swift ve Objective-C'de bellek yönetimi mekanizmasıdır ve nesnelere tahsis edilen belleği otomatik olarak izler ve serbest bırakır. Her sınıf örneğinin bir referans sayacı vardır; bu sayı, nesneye güçlü bir referans oluşturulduğunda artar ve kaldırıldığında azalır. Referans sayacı sıfıra ulaştığında, ARC nesneyi otomatik olarak de-allocate eder ve kullandığı belleği serbest bırakır.
ARC, bellek sızıntılarını ve çift serbest bırakmayı önler, manuel yönetimle (örneğin Objective-C'de ARC olmadan) karşılaştırıldığında bellek yönetimini basitleştirir.
Üç tür referans vardır:
- Strong (Güçlü): Nesnenin referans sayacını artırır. Varsayılan referans türüdür.
- Weak (Zayıf): Referans sayacını artırmaz. İki nesne birbirine güçlü referanslar verdiğinde oluşabilecek döngüleri önlemek için kullanılır. Zayıf referans, hedef nesne de-allocate edildiğinde
nilolur.weakanahtar kelimesiyle tanımlanır. - Unowned (Mülk sahibi olmayan): Referans sayacını artırmaz ve her zaman bir değere sahiptir. Nesne her zaman var olacağı bilinen durumlarda kullanılır.
weak'in aksine,unownedreferansınilolmaz ve nesneye erişmeye çalışırken hata verebilir.unownedanahtar kelimesiyle tanımlanır.
Güçlü referans döngüsüne örnek:
class Human {
let name: String
var apartment: Apartment? // Opsiyonel Apartment'a güçlü referans
init(name: String) {
self.name = name
print("\(name) başlatılıyor")
}
deinit {
print("\(name) sonlandırılıyor")
}
}
class Apartment {
let unit: String
var tenant: Human? // Opsiyonel Human'a 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: Human?
var unit4A: Apartment?
john = Human(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
unit4A = nil
// Güçlü referans döngüsü nedeniyle "John Appleseed sonlandırılıyor" veya "Daire 4A sonlandırılıyor" yazdırılmayacaktır.
weak kullanarak güçlü referans döngüsünü çözme:
class Human {
let 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 {
let unit: String
weak var tenant: Human? // 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: Human?
var unit4A: Apartment?
john = Human(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil // John, referans sayacı 0 olduğu için de-allocate edilir
unit4A = nil // Daire, referans sayacı 0 olduğu için de-allocate edilir