Sobes.tech
Junior — Middle

Kaip galima nustatyti išlaikymo ciklus (retain cycle) atmintyje programų kūrimo metu?

sobes.tech AI

Atsakymas iš AI

Išsaugojimo ciklai (retain cycles) atsiranda, kai du ar daugiau objektų vienas kitą nurodo stipriomis nuorodomis, dėl ko atmintis nėra atlaisvinama, net jei objektai jau nebėra reikalingi.

Norint aptikti tokius ciklus iOS, galima naudoti šiuos metodus:

  • Instruments įrankis (Leaks ir Allocations): leidžia stebėti atminties nutekėjimus ir matyti, kurie objektai lieka atmintyje.
  • Xcode Memory Graph Debugger: vizualizuoja objektus ir jų ryšius, padeda rasti išsaugojimo ciklus.
  • Kodo analizė dėl stiprių nuorodų naudojimo uždarymuose ir delegatuose: dažnai ciklai atsiranda dėl stiprių nuorodų uždarymuose (closure) arba delegatuose, kuriuos reikia pažymėti kaip weak arba unowned.

Pavyzdys:

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

    func setup() {
        closure = {
            print(self) // stipri nuoroda į self
        }
    }
}

Čia ViewController palaiko closure, o closure palaiko self — susidaro ciklas. Norint jo išvengti, naudojama [weak self]:

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

Taip, ciklų aptikimas apjungia profilavimo įrankius ir kruopštų kodo analizę dėl stiprių nuorodų.