Sobes.tech
Junior — Middle

Kaip teisingai organizuoti nuorodas objektų modelyje, kad būtų išvengta atminties ciklų?

sobes.tech AI

Atsakymas iš AI

Siekiant išvengti ciklinio atminties sulaikymo objektų modelyje iOS (naudojant Swift arba Objective-C), svarbu teisingai naudoti stiprias (strong), silpnas (weak) ir be savininko (unowned) nuorodas.

Pagrindinė idėja:

  • strong — turinti nuoroda, padidina objekto nuorodų skaitiklį.
  • weak — neturinti nuoroda, nepadidina skaitiklio, automatiškai nustatoma į nil, kai objektas pašalinamas.
  • unowned — neturinti nuoroda, nepadidina skaitiklio, bet nėra nustatoma į nil, naudojama, kai objektas garantuotai gyvena ilgiau.

Dažnai susidaro ciklai, pavyzdžiui, tarp tėvo ir vaiko arba tarp delegato ir objekto. Norint išvengti ciklų:

  • Tėvas laiko vaiką per strong.
  • Vaikas nurodo į tėvą per weak arba unowned.

Pavyzdys Swift:

class Parent {
    var child: Child?
}

class Child {
    weak var parent: Parent?  // silpna nuoroda, siekiant išvengti ciklo
}

let parent = Parent()
let child = Child()
parent.child = child
child.parent = parent

Taip, kai parent ir child nebebus naudojami, atmintis bus teisingai atlaisvinta, be ciklų ir atminties praradimų.