Closure taqbad (captures) il-varjabbli li tirreferenzja, u żżommhom ħajjin. Meta closure taqbad self u self iżomm ukoll il-closure (stored property), iżommu lil xulxin ħajjin għal dejjem — li jitlef il-memorja. bħal tkisser dak iċ-ċiklu.
Closure taqbad (captures) il-varjabbli li tirreferenzja, u żżommhom ħajjin. Meta closure taqbad self u self iżomm ukoll il-closure (stored property), iżommu lil xulxin ħajjin għal dejjem — li jitlef il-memorja. bħal tkisser dak iċ-ċiklu.
[weak self]L-ARC jeħles oġġett meta l-għadd tar-referenzi tiegħu jilħaq żero. Qabda strong iżid dak l-għadd.
final class Downloader {
var onDone: (() -> Void)? // stored closure -> strong
func start() {
// BAD: closure captures self strongly, self holds closure -> cycle
onDone = { self.cleanup() }
// GOOD: weak capture, self can deallocate
onDone = { [weak self] in
guard let self else { return } // safely unwrap; bail if gone
self.cleanup()
}
}
func cleanup() {}
}
[weak self] — self isir optional; ikun nil jekk l-oġġett ġie meħlus. Default sikur meta l-oġġett jista' jibqa' ħaj wara l-closure.[unowned self] — mhux optional, l-ebda overhead tal-ARC, imma jikkrexxja jekk self ikun diġà spiċċa. Uża biss meta self ikun garantit li jibqa' ħaj aktar mill-closure.Task { [weak self] in
let data = await self?.fetch() // self? short-circuits if deallocated
}
Closures non-escaping (eż. map, filter, forEach) jaħdmu b'mod sinkroniku u jerħu l-qabdiet immedjatament — l-ebda ċiklu, l-ebda bżonn ta' [weak self]. Ir-riskju huwa mal-closures escaping u stored: completion handlers, Timer, NotificationCenter, Combine sinks, delegate blocks.
Ir-retain cycles huma l-aktar memory leak komuni f'iOS, u huma inviżibbli sakemm Instruments juri memorja dejjem tikber. Li tkun taf eżatt meta closure tagħmel escape u għaliex hemm bżonn [weak self] — minflok tużah b'mod riflessiv kullimkien — jifred l-inġiniera li jifhmu l-ARC minn dawk li jimitawh mingħajr ma jifhmuh.
Librerija ta' mistoqsijiet ta' intervisti tal-IT b'tweġibiet dettaljati — minn Junior sa Senior.
Iddona