Sobes.tech
Middle

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:

  1. Strong (Güçlü): Nesnenin referans sayacını artırır. Varsayılan referans türüdür.
  2. 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 nil olur. weak anahtar kelimesiyle tanımlanır.
  3. 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, unowned referansı nil olmaz ve nesneye erişmeye çalışırken hata verebilir. unowned anahtar 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