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.