Junior — Middle
Kako identifikovati cikluse zadržavanja (retain cycle) u memoriji tokom razvoja aplikacija?
sobes.tech АИ
Одговор од АИ
Ciklovi zadržavanja (retain cycles) nastaju kada dva ili više objekata međusobno referenciraju jedni druge putem jakih referenci, zbog čega se memorija ne oslobađa čak ni kada objekti više nisu potrebni.
Za otkrivanje takvih ciklusa na iOS-u, mogu se koristiti sledeće metode:
- Instrumenti (Leaks i Allocations): omogućavaju praćenje curenja memorije i prikazuju koje objekte ostaju u memoriji.
- Xcode Memory Graph Debugger: vizualizuje objekte i njihove veze, pomažući da se pronađu ciklusi zadržavanja.
- Analiza koda za korišćenje jakih referenci u zatvaranjima i delegatima: često, ciklusi nastaju zbog jakih referenci u zatvaranjima (
closure) ili delegatima, koje treba označiti kaoweakiliunowned.
Primer:
class ViewController {
var closure: (() -> Void)?
func setup() {
closure = {
print(self) // jaka referenca na self
}
}
}
Ovde, ViewController drži closure, a closure drži self — formira se ciklus. Da bi se to izbeglo, koristi se [weak self]:
closure = { [weak self] in
guard let self = self else { return }
print(self)
}
Na ovaj način, otkrivanje ciklusa zadržavanja kombinuje alate za profilisanje i pažljivu analizu koda o jakim referencama.