Sobes.tech
Junior — Middle

Ako odhaliť cykly zadržiavania (retain cycle) v pamäti pri vývoji aplikácií?

sobes.tech AI

Odpoveď od AI

Cyklus udržiavania (retain cycles) vznikajú, keď si dva alebo viac objektov navzájom odkazujú silnými referenciami, čo spôsobí, že pamäť nie je uvoľnená, aj keď objekty už nie sú potrebné.

Na detekciu takýchto cyklov v iOS možno použiť nasledujúce metódy:

  • Nástroj Instruments (Leaks a Allocations): umožňuje sledovať úniky pamäti a zobraziť, ktoré objekty zostávajú v pamäti.
  • Xcode Memory Graph Debugger: vizualizuje objekty a ich spojenia, pomáha nájsť cykly udržiavania.
  • Analýza kódu na použitie silných referencií v uzávierkach a delegátoch: často cykly vznikajú kvôli silným referenciám v uzávierkach (closure) alebo delegátoch, ktoré je potrebné označiť ako weak alebo unowned.

Príklad:

class ViewController {
    var closure: (() -> Void)?

    func setup() {
        closure = {
            print(self) // silné zachytenie self
        }
    }
}

Tu ViewController udržiava closure, a closure udržiava self — vytvára sa cyklus. Aby sa tomu zabránilo, používa sa [weak self]:

closure = { [weak self] in
    guard let self = self else { return }
    print(self)
}

Týmto spôsobom detekcia cyklov udržiavania kombinuje profilovacie nástroje a dôslednú analýzu kódu na silné referencie.