Sobes.tech
Junior — Middle

Jak správně organizovat odkazy v objektovém modelu, aby se zabránilo cyklickému zadržování paměti?

sobes.tech AI

Odpověď od AI

Abyste zabránili cyklům zadržování paměti v objektovém modelu na iOS (použitím Swift nebo Objective-C), je důležité správně používat silné (strong), slabé (weak) a bez vlastnictví (unowned) odkazy.

Hlavní myšlenka:

  • strong — vlastnický odkaz, zvyšuje čítač odkazů objektu.
  • weak — ne vlastnický odkaz, nezvyšuje čítač, automaticky se nastaví na nil při odstranění objektu.
  • unowned — ne vlastnický odkaz, nezvyšuje čítač, ale není nastavován na nil, používá se, když je zaručeno, že objekt bude žít déle.

Často vznikají cykly, například mezi rodičem a potomkem nebo mezi delegátem a objektem. Abychom se cyklům vyhnuli:

  • Rodič drží potomka přes strong.
  • Potomek odkazuje na rodiče přes weak nebo unowned.

Příklad v Swift:

class Parent {
    var child: Child?
}

class Child {
    weak var parent: Parent?  // slabý odkaz, aby se předešlo cyklu
}

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

Tímto způsobem se paměť správně uvolní, když parent a child přestanou být používány, bez cyklů a úniků paměti.