Sobes.tech
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 release veya dealloc hatası 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.