Middle
iOS'ta retain cycle (bellek döngüsü) oluşumunu nasıl önleyebilirsiniz?
sobes.tech yapay zeka
AI'dan gelen yanıt
İşaretleri tutma döngüleri, zayıf (weak) veya koşulsuz (unowned) referansların doğru kullanımıyla önlenir.
Zayıf referanslar (weak):
- Nesnenin referans sayacını artırmazlar.
- Boş (nil) olabilirler (
nilolabilir). - Bir nesne, başka bir nesneden bağımsız olarak var olabilir (örneğin, bir delege).
class DelegateExample {
weak var delegate: SomeDelegateType? // Zayıf referans delege
}
Koşulsuz unowned referanslar (unowned):
- Nesnenin referans sayacını artırmazlar.
- Kesinlikle boş olmayan (
non-nil) olurlar. - Bir nesne açıkça başka bir nesneye sahip olduğunda ve bağımlı nesne yalnızca sahip ile birlikte var olabiliyorsa kullanılırlar (örneğin,
self'i yakalayan kapanışlar, sınıfta, kapanış açıkça sınıf örneğine ait).unownedreferansa erişirken, nesne zaten serbest bırakılmışsa, çalışma zamanı hatası oluşur.
class Owner {
var closure: (() -> Void)?
func setupClosure() {
closure = { [unowned self] in // Koşulsuz `unowned` referans self
// self kullanımı
print("Unowned self kullanımı")
}
}
}
Kapanışlarda kullanımı:
Kapanışlar, sınıf örneklerini güçlü referansla yakalarlarsa, tutma döngüleri oluşturabilirler ve bu sınıf örneği de kapanışı güçlü referansla içerir. Bunu önlemek için, kapanışın başında yakalama listeleri (capture lists) kullanılır:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = { [weak self] in // Zayıf referans self
guard let strongSelf = self else {
return "" // self zaten nil ise durumunu yönet
}
if let text = strongSelf.text {
return "<\(strongSelf.name)>\(text)</\(strongSelf.name)>"
} else {
return "<\(strongSelf.name)/>"
}
}
init(name: String, text: String? = nil) {
self.name = name
self.text = text
}
deinit {
print("\(name) yok ediliyor")
}
}
weak ve unowned arasındaki seçim, nesneler arasındaki ilişkilerin semantiğine bağlıdır:
weak: referans, nesnenin yaşam döngüsü boyuncanilolma olasılığı varsa.unowned: referans, referans alan nesneden daha uzun veya eşit süreyle var oluyorsa ve aslanilolmayacaksa kullanılır.