Sobes.tech
Middle

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: unowned optional değildir (eğer unowned optional olarak belirtilmediyse). weak her zaman optinaldir.
  • Güvenlik: unowned referansına erişim, nesne zaten dealloc edilmişse çökmeye neden olur. weak referansı nil dö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.