Middle
iOSda retention cycle (saqlash sikli) yuzaga kelishini qanday oldini olish mumkin?
sobes.tech AI
AIdan javob
Retenční döngüleri önlemek için zayıf (weak) veya koşulsuz (unowned) referansların doğru kullanımı gereklidir.
Zayıf referanslar (weak):
- Nesnenin referans sayacını artırmazlar.
nilolabilirler (nullable).- Bir nesne, başka bir nesneden bağımsız olarak var olabilir (örneğin, delege).
class DelegateExample {
weak var delegate: SomeDelegateType? // Zayıf referans delege
}
Koşulsuz unowned referanslar (unowned):
- Nesnenin referans sayacını artırmazlar.
- Kesinlikle
nilolmayan (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.