Sobes.tech
Junior — Middle

Czy możesz wymienić główne rodzaje wycieków pamięci, które mogą wystąpić podczas programowania w Swift?

sobes.tech AI

Odpowiedź od AI

W Swift główne rodzaje wycieków pamięci są związane z cyklicznymi odniesieniami (retains cycles), które występują, gdy obiekty utrzymują się nawzajem, a ARC (Automatic Reference Counting) nie może zwolnić pamięci. Główne przypadki:

  • Cykliczne odniesienia między klasami: dwa obiekty klasy z silnymi odniesieniami do siebie.
  • Zamknięcia, które przechwytują self: jeśli zamknięcie przechwytuje self bez użycia [weak self] lub [unowned self], prowadzi to do cyklu.
  • Silne odniesienia w delegatach: jeśli delegat jest zadeklarowany jako silne odniesienie, a obiekt delegata odwołuje się z powrotem.

Przykład wycieku z zamknięciem:

class ViewController {
    var closure: (() -> Void)?

    func setup() {
        closure = {
            print(self) // przechwytuje self silnym odniesieniem
        }
    }
}

Aby tego uniknąć, używa się słabych odniesień:

closure = { [weak self] in
    guard let self = self else { return }
    print(self)
}

W ten sposób, głównym celem jest kontrola silnych odniesień i używanie słabych lub bezwłaścicielskich odniesień tam, gdzie jest to konieczne.