Sobes.tech
Middle

Wick bağlantıları ile Anound bağlantıları arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Zayıf referans (weak), nesnenin referans sayacını artırmayan bir referanstır. Güçlü referans döngülerini önlemek için kullanılır, örneğin, bir delege ile onun sahibi arasında. Zayıf referansın gösterdiği nesne dealloc edildiğinde, zayıf referans otomatik olarak nil olur.

Unowned referans (unowned) de nesnenin referans sayacını artırmayan bir referanstır. weak ile farkı, unowned'ın opsiyonel olamayışı (Optional) ve her zaman var olan bir nesneye işaret etmesi gerektiğidir. Eğer unowned ile gösterilen nesne dealloc edilirse ve referansa erişilmeye çalışılırsa, çalışma zamanında hata (fatal error) oluşur. Bu, bağlı nesnenin yaşam döngüsünün, unowned referanslı nesneden daha uzun veya eşit olduğu durumlarda kullanılır (örneğin, güçlü referans döngülerinde, nesnelerden biri belirli bir yaşam döngüsüne sahipse).

Karşılaştırma:

Özellik weak unowned
Sahip olmayan Evet Evet
Referans sayacını artırmaz Evet Evet
nil olabilir mi? Evet (otomatik olarak nil olur) Hayır (her zaman nesneye işaret etmeli)
Güvenlik Dealloc edilme durumunda daha güvenli Daha az güvenli (dealloc edilen nesneye erişimde hata)
Tip Opsiyonel olmalı Opsiyonel olamaz (varsayılan)
Kullanım Güçlü referans döngülerini önlemek, nesne yaşam döngüsü garantili Güçlü referans döngülerini önlemek, nesne yaşam döngüsü garantili

weak kullanımı örneği:

class Person {
    let name: String
    weak var apartment: Apartment? // döngüyü önlemek için zayıf referans

    init(name: String) {
        self.name = name
        print("\(name) başlatıldı")
    }

    deinit {
        print("\(name) yok edildi")
    }
}

class Apartment {
    let unit: String
    var occupant: Person?

    init(unit: String) {
        self.unit = unit
        print("Daire \(unit) başlatıldı")
    }

    deinit {
        print("Daire \(unit) yok edildi")
    }
}

unowned kullanımı, self'i yakalayan bir kapanışta:

class HTMLElement {
    let name: String
    let text: String?

    lazy var asHTML: () -> String = {
        [unowned self] in // self, döngüyü önlemek için unowned
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    deinit {
        print("\(name) yok edildi")
    }
}