Sobes.tech
Junior — Middle

Kā atklāt noturēšanas ciklus (retain cycle) atmiņā, izstrādājot lietotnes?

sobes.tech AI

Atbilde no AI

Saglabāšanas cikli (retain cycles) rodas, kad divi vai vairāki objekti viens otru atsaucas ar stiprām atsaucēm, kas novērš atmiņas brīvu atbrīvošanu, pat ja objekti vairs nav nepieciešami.

Lai identificētu šādus ciklus iOS, var izmantot šādas metodes:

  • Instruments rīks (Leaks un Allocations): ļauj izsekot atmiņas noplūdēm un parādīt, kuri objekti paliek atmiņā.
  • Xcode Memory Graph Debugger: vizualizē objektus un to saites, palīdz atrast saglabāšanas ciklus.
  • Koda analīze par stipru atsauču izmantošanu aizkavējumos un deleģentos: bieži cikli rodas stipru atsauču dēļ aizkavējumos (closure) vai deleģentos, kurus nepieciešams atzīmēt kā weak vai unowned.

Piemērs:

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

    func setup() {
        closure = {
            print(self) // stipra atsauce uz self
        }
    }
}

Šeit ViewController uztur closure, un closure uztur self — veidojot ciklu. Lai no tā izvairītos, tiek izmantots [weak self]:

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

Tādējādi saglabāšanas ciklu atklāšana apvieno profilēšanas rīkus un rūpīgu koda analīzi par stiprām atsaucēm.