Sobes.tech
Junior

Zayıf ve güçlü bağlantılar arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Hafıza yönetim mekanizmasındaki (ARC - Otomatik Referans Sayımı) fark.

  • Güçlü referans (Strong reference): Nesnenin referans sayacını 1 artırır. Nesne, ona en az bir güçlü referans olduğu sürece bellekten serbest bırakılamaz. Bu davranış Swift'te varsayılan olarak özellikler ve değişkenler için geçerlidir.

  • Zayıf referans (Weak reference): Nesnenin referans sayacını artırmaz. Çevrimsel referansları önlemek için kullanılır, iki veya daha fazla nesne birbirine güçlü referanslar içerdiğinde, bu bellek sızıntısına yol açar. Zayıf referanslar her zaman opsiyoneldir (Optional), çünkü referans aldığı nesne herhangi bir zamanda serbest bırakılabilir. Nesne serbest bırakıldığında, zayıf referans otomatik olarak nil olur.

Zayıf referans kullanımıyla çevrimsel referansın önlenmesine örnek:

class Person {
    let name: String
    var apartment: Apartment? // Başlangıçta güçlü referans
    init(name: String) { self.name = name }
    deinit { print("\(name) serbest bırakılıyor") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Zayıf referans
    init(unit: String) { self.unit = unit }
    deinit { print("Daire \(unit) serbest bırakılıyor") }
}

var john: Person? // Person örneği
var unit4A: Apartment? // Apartment örneği

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

// Güçlü referans döngüsü oluşturma:
// john, daireye güçlü referans tutar
// daire, kişiye güçlü referans tutar
john!.apartment = unit4A
unit4A!.tenant = john // Bu zayıf olmalı, döngüyü kırmak için

john = nil // john'u nil yapmak, döngü varsa serbest bırakmaz
unit4A = nil // daireyi nil yapmak, döngü varsa serbest bırakmaz

// Zayıf referans kullanıldığında beklenen çıktı:
// John Appleseed serbest bırakılıyor
// Daire 4A serbest bırakılıyor

weak olmadan tenant için, yok ediciler çağrılmazdı, bu da bellek sızıntısına işaret eder.