Sobes.tech
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 kao weak ili unowned.

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.