Sobes.tech
Middle

Swift'te unowned nedir ve nasıl kullanılır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Swift'te sahip olmayan referans (zayıf dolaylı sahiplik), iki nesne birbirine güçlü referanslar (sıkı tutma döngüleri) oluşturduğunda, bunların bellekten serbest bırakılmasını engellemek için kullanılır.

unowned özellikleri:

  • unowned referansın gösterdiği nesnenin her zaman var olduğunu garanti eder, bu referans kullanılırken.
  • Bağlantılı nesne serbest bırakıldıktan sonra unowned referansa erişmeye çalışmak çalışma zamanı hatası (runtime crash) ile sonuçlanır.
  • Bu, referansın nesnenin yaşam döngüsünden daha kısa olmadığı durumlarda kullanılır. Yani, unowned referans nesneyi güçlendirmez.

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

class Customer {
    let name: String
    var card: CreditCard?

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

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

class CreditCard {
    let number: UInt64
    unowned let customer: Customer // Customer'a unowned referans

    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }

    deinit {
        print("Kredi kartı #\(number) yok ediliyor")
    }
}

var john: Customer? // Serbest bırakmayı sağlamak için opsiyonel Customer
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)

// `nil` ataması, Customer ve Card nesnelerinin serbest bırakılmasına neden olur,
// çünkü güçlü referans döngüsü yoktur
john = nil 

Başka bir örnek - kapanışta unowned kullanımı:

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

    lazy var asHTML: () -> String = { [unowned self] in // unowned self kullanımı
        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 ediliyor")
    }
}

var paragraph: HTMLElement? // Opsiyonel HTML elementi
paragraph = HTMLElement(name: "p", text: "merhaba dünya")
print(paragraph!.asHTML())

// `nil` ataması HTMLElement'i serbest bırakır, çünkü kapanış onu güçlü tutmaz
paragraph = nil

unowned ve weak arasında seçim, referansın nil olup olamayacağına bağlıdır. Eğer referans asla nil olamayacaksa, unowned kullanın. Eğer olabiliyorsa, weak kullanın.