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.