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")
}
}