Unowned referans tipi ne işe yarar?
sobes.tech yapay zeka
AI'dan gelen yanıt
unowned referanslar, nesneler arasında döngüsel referansları (retain cycle) çözmek için gereklidir; bu durumda her iki nesne de birbirine güçlü referanslara sahiptir, ancak bir nesnenin yaşam döngüsü diğerinden daha kısa veya eşittir.
unowned, referans verilen nesnenin, referansı içeren nesnenin yaşamı boyunca nil olmayacağı bilindiğinde kullanılır. weak'in aksine, unowned referansa erişirken Optional kullanılmaz. Eğer unowned referans verilen nesne, unowned referansa sahip nesneden önce dealloc edilirse, uygulama çöker.
Kapanışlarda kullanım örneği:
class Person {
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
// Apartment'in, Person olmadan var olamayacağı bilindiği için unowned kullanılır
// (bu bağlamda). Person `nil` olabilir,
// ama Apartment varsa, Person da vardır.
unowned let tenant: Person
init(unit: String, tenant: Person) {
self.unit = unit
self.tenant = tenant
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")
// Bu örnekte tenant `nil` olabilir, bu yüzden
// unowned optional kullanılır
unit4A = Apartment(unit: "4A", tenant: john!)
john!.apartment = unit4A
// Güçlü referansları kırıp, deallocasyonu test edelim
john = nil
unit4A = nil
Bu örnekte, Person nesnesi güçlü bir referansla Apartment nesnesine sahiptir (var apartment: Apartment?). Apartment nesnesi, Person nesnesine güçlü referansla sahip olabilir, bu da bir döngü oluşturur. Ancak, bu bağlamda Apartment'in Person olmadan var olamayacağı bilindiği için, Apartment'ten Person'a referans unowned yapılır. Böylece, john = nil yapıldığında, Person nesnesi de dealloc edilir ve (güçlü referanslar olmadığı için) Apartment nesnesi de dealloc edilir.
weak ile temel farklar:
- Yaşam döngüsü:
unowned, referans verilen nesnenin yaşam döngüsü, referansı içeren nesneden daha uzun veya eşit ise kullanılır.weak, referans verilen nesne daha erken dealloc edilebileceği durumlar içindir. - Optional:
unownedoptional değildir (eğerunowned optionalolarak belirtilmediyse).weakher zaman optinaldir. - Güvenlik:
unownedreferansına erişim, nesne zaten dealloc edilmişse çökmeye neden olur.weakreferansınildöner.
Sonuç olarak, unowned, referans verilen nesnenin, referansı içeren nesne var olduğu sürece var olacağı garantisi verilen, sahip olmayan (non-owning) bir referanstır.