Middle
iOS-də retention cycle (saxlama döngüsü) yaranmasının qarşısını necə almaq olar?
sobes.tech Süni İntellekt
AI-dan cavab
Yadda saxlama dövrlərini qarşısını almaq üçün zəif (weak) və ya şərtsiz (unowned) referansların düzgün istifadəsi vacibdir.
Zəif referanslar (weak):
- Obrazın referans sayğacını artırmır.
nilola bilər (nullable).- Bir obyekt digərindən müstəqil olaraq mövcud ola bilər (məsələn, nümayəndəçi).
class DelegateExample {
weak var delegate: SomeDelegateType? // Zəif referans nümayəndəçiyə
}
Şərtsiz unowned referanslar (unowned):
- Obrazın referans sayğacını artırmır.
- Qətiyyən
nildeyil (non-nil). - Bir obyekt açıq şəkildə başqa birinə sahibdirsə və asılı obyekt yalnız sahibi ilə birlikdə mövcuddursa istifadə olunur (məsələn,
self-i tutan bağlamalar, sinifdə, bağlama açıq şəkildə sinif nümunəsinə aiddir).unownedreferansına girişdə, əgər obyekt artıq sərbəst buraxılıbsa, icra zamanı xəta baş verir.
class Owner {
var closure: (() -> Void)?
func setupClosure() {
closure = { [unowned self] in // Şərtsiz `unowned` referans self
// self istifadə
print("Unowned self istifadə")
}
}
}
Bağlamalarda istifadə:
Bağlamalar, sinif nümunələrini güclü referansla tutarlarsa, saxlama dövrləri yarada bilərlər və bu sinif nümunəsi də bağlamaya güclü referansdır. Bunu qarşısını almaq üçün, bağlamanın əvvəlində tutma siyahıları (capture lists) istifadə olunur:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = { [weak self] in // Zəif referans self
guard let strongSelf = self else {
return "" // self artıq nil olduqda
}
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) sərbəst buraxılır")
}
}
weak və unowned seçimi, obyektlər arasındakı münasibətlərin semantikasına bağlıdır:
weak: referans, obyektin həyat dövrü boyuncanilola bilər.unowned: referans, obyekt daha uzun və ya eyni müddətdə mövcuddursa və heç vaxtnilolmayacaqsa istifadə olunur.