Sobes.tech
Junior — Middle

Ar galite išvardyti pagrindinius atminties nutekėjimo tipus, kurie gali atsirasti programuojant Swift?

sobes.tech AI

Atsakymas iš AI

Swift kalba, pagrindiniai atminties nutekėjimo tipai susiję su ciklinėmis nuorodomis (retain cycles), kurios atsiranda, kai objektai vienas kitą laiko, ir ARC (Automatic Reference Counting) negali atlaisvinti atminties. Pagrindiniai atvejai:

  • Ciklinės nuorodos tarp klasių: du klasių objektai su stipriomis nuorodomis vienas į kitą.
  • Uždarymai, kurie gaudo self: jei uždarymas gaudo self be [weak self] ar [unowned self], tai sukelia ciklą.
  • Stiprios nuorodos delegatuose: jei delegatas deklaruotas kaip stipri nuoroda, o delegato objektas nurodo atgal.

Pavyzdys su uždarymu ir nutekėjimu:

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

    func setup() {
        closure = {
            print(self) // gaudo self stipria nuoroda
        }
    }
}

Norint išvengti, naudojamos silpnos nuorodos:

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

Taigi, pagrindinis tikslas yra kontroliuoti stiprias nuorodas ir naudoti silpnas arba be savininko nuorodas ten, kur tai būtina.