Sobes.tech
Junior — Middle

Jak poprawnie organizować odnośniki w modelu obiektowym, aby zapobiec cyklicznemu zatrzymywaniu pamięci?

sobes.tech AI

Odpowiedź od AI

Aby zapobiec cyklom zatrzymania pamięci w modelu obiektowym na iOS (używając Swift lub Objective-C), ważne jest poprawne użycie silnych (strong), słabych (weak) i bezwładnych (unowned) odniesień.

Główna idea:

  • strong — odniesienie posiadające, zwiększa licznik odniesień obiektu.
  • weak — odniesienie nieposiadające, nie zwiększa licznika, jest automatycznie ustawiane na nil po usunięciu obiektu.
  • unowned — odniesienie nieposiadające, nie zwiększa licznika, ale nie jest ustawiane na nil, gdy obiekt żyje dłużej.

Często występują cykle, np. między rodzicem a dzieckiem lub między delegatem a obiektem. Aby ich uniknąć:

  • Rodzic trzyma dziecko przez strong.
  • Dziecko odwołuje się do rodzica przez weak lub unowned.

Przykład w Swift:

class Parent {
    var child: Child?
}

class Child {
    weak var parent: Parent?  // słabe odniesienie, aby uniknąć cyklu
}

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

W ten sposób, gdy parent i child przestaną być używane, pamięć jest poprawnie zwalniana, bez wycieków z powodu cykli.