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:
unownedreferans, ona referans verilen nesnenin yaşamı boyuncanilolmayacaktı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
unownedreferansla 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.