Junior — Middle
Jak wykryć cykle zatrzymania (retain cycle) w pamięci podczas tworzenia aplikacji?
sobes.tech AI
Odpowiedź od AI
Cykl utrzymania (retain cycles) występuje, gdy dwa lub więcej obiektów odwołuje się do siebie nawzajem za pomocą silnych referencji, co powoduje, że pamięć nie jest zwalniana, nawet jeśli obiekty nie są już potrzebne.
Aby wykryć takie cykle w iOS, można użyć następujących metod:
- Narzędzie Instruments (Leaks i Allocations): pozwala śledzić wycieki pamięci i zobaczyć, które obiekty pozostają w pamięci.
- Debug Memory Graph Xcode: wizualizuje obiekty i ich powiązania, pomagając znaleźć cykle utrzymania.
- Analiza kodu pod kątem użycia silnych referencji w zamknięciach i delegatach: często cykle powstają z powodu silnych referencji w zamknięciach (
closure) lub delegatach, które należy oznaczyć jakoweaklubunowned.
Przykład:
class ViewController {
var closure: (() -> Void)?
func setup() {
closure = {
print(self) // silne przechwycenie self
}
}
}
Tutaj ViewController utrzymuje closure, a closure utrzymuje self — tworząc cykl. Aby tego uniknąć, używa się [weak self]:
closure = { [weak self] in
guard let self = self else { return }
print(self)
}
W ten sposób wykrywanie cykli utrzymania łączy narzędzia profilowania i dokładną analizę kodu pod kątem silnych referencji.