Sobes.tech
Middle

Unowned nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

unowned — Swift'te zayıf bir referans bildirmek için anahtar kelimedir. İki nesne güçlü bir ilişkiye sahip olduğunda ve yaşam döngüleri birbirine bağlı olduğunda kullanılır, ancak döngüsel referansları önlemek ve belleğin serbest bırakılmasını engelleyebilecek durumları önlemek isteriz.

Ana özellikler ve weak ile farkları:

  • Opsiyonel değil: unowned referans, ona referans verilen nesnenin yaşamı boyunca nil olmayacaktır.
  • Güçlü ilişki: Bir nesnenin diğerine sahip olduğu ve her ikisinin de birlikte her zaman var olduğu durumlarda kullanılır.
  • Serbest bırakma sırasında: Eğer unowned referansla referans verilen nesne, referans kullanılmadan önce bellekten kaldırılırsa, bu uygulama çökmesine (runtime error) neden olur. Referans verilen nesnenin, referansın kendisinden daha uzun süre var olduğundan emin olmak gerekir.
  • Uygulama: Genellikle delegeler için kullanılır, çünkü delege her zaman çağıran nesneden daha uzun süre var olur veya self'e referans içermeyen kapanışlarda (closure) döngüsel referansları önlemek için kullanılır.

Kapanışta kullanım örneği:

// swift
class MyClass {
    var name: String
    var closure: (() -> Void)?

    init(name: String) {
        self.name = name
    }

    func setupClosure() {
        closure = { [unowned self] in // unowned self kullanımı
            print("Benim adım \(self.name)")
        }
    }

    deinit {
        print("\(name) deinitialized")
    }
}

Delegatör için kullanım örneği (weak genellikle delegeler için kullanılır, ancak unowned da kullanılabilir, eğer delegenin garantili olarak daha uzun yaşadığı biliniyorsa):

// swift
protocol MyDelegate: AnyObject { // AnyObject referans tipi gerektirir
    func doSomething()
}

class DataSource {
    unowned var delegate: MyDelegate // unowned referans

    init(delegate: MyDelegate) {
        self.delegate = delegate
    }

    func performAction() {
        delegate.doSomething()
    }

    deinit {
        print("DataSource deinitialized")
    }
}

class MyController: MyDelegate {
    var dataSource: DataSource?

    override init() {
        super.init()
        dataSource = DataSource(delegate: self)
    }

    func doSomething() {
        print("Delegate method called")
    }

    deinit {
        print("MyController deinitialized")
    }
}

weak ve unowned arasındaki seçim, referansın opsiyonel olup olmaması ve referans verilen nesnenin referansın sonuna kadar var olup olmayacağına bağlıdır. Nesne, referans kullanılmadan önce serbest bırakılma ihtimali varsa weak kullanılmalıdır. Nesnenin varlığı garanti ediliyorsa ve referans opsiyonel olmamalıysa, unowned kullanılabilir.