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:
unownedreferansı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
unownedreferansa 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,
unownedreferans 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.