Sobes.tech
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ć jako weak lub unowned.

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.