Closure hukamata (captures) variables inazorejelea, ikiziweka hai. Wakati closure inakamata self na self pia inashikilia closure (kama stored property), hushikiliana hai milele — inayovujisha kumbukumbu. kama huvunja mzunguko huo.
Closure hukamata (captures) variables inazorejelea, ikiziweka hai. Wakati closure inakamata self na self pia inashikilia closure (kama stored property), hushikiliana hai milele — inayovujisha kumbukumbu. kama huvunja mzunguko huo.
[weak self]ARC huachilia object wakati reference count yake inafikia sifuri. Strong capture huongeza hesabu hiyo.
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 huwa optional; ni nil iwapo object iliachiliwa. Chaguo salama la default wakati object inaweza kuishi zaidi ya closure.[unowned self] — si optional, hakuna gharama ya ARC, lakini hu-crash iwapo self tayari imeenda. Tumia tu wakati self imehakikishwa kuishi zaidi ya closure.Task { [weak self] in
let data = await self?.fetch() // self? short-circuits if deallocated
}
Non-escaping closures (mfano map, filter, forEach) huendeshwa kwa mfululizo (synchronously) na huachilia captures mara moja — hakuna cycle, hakuna haja ya [weak self]. Hatari iko na closures za escaping, zilizohifadhiwa: completion handlers, Timer, NotificationCenter, Combine sinks, na delegate blocks.
Retain cycles ni uvujaji wa kumbukumbu wa kawaida zaidi katika iOS, na hazionekani hadi Instruments zionyeshe kumbukumbu inayoongezeka. Kujua hasa lini closure inafanya escape na kwa nini [weak self] inahitajika — dhidi ya kuitumia kila mahali kiharakaharaka — hutofautisha engineers wanaoelewa ARC na wale wanaoifuata bila kuelewa (cargo-cult).
Maktaba ya maswali ya mahojiano ya IT yenye majibu ya kina — kutoka Junior hadi Senior.
Changia