Junior — Middle
Czy możesz podać przykład, kiedy w zamknięciu w Swift konieczne jest użycie weak self, aby zapobiec cyklicznym referencjom?
sobes.tech AI
Odpowiedź od AI
W Swift występuje cykliczne odniesienie, gdy obiekt przechwytuje odniesienie do siebie samego w zamknięciu, a to zamknięcie jest przechowywane w tym samym obiekcie, co prowadzi do wzajemnego utrzymywania i wycieku pamięci. Aby tego uniknąć, używa się weak self.
Przykład: masz klasę ViewController, która uruchamia asynchroniczną operację z zamknięciem. Jeśli w zamknięciu użyjesz self bezpośrednio, to ViewController będzie utrzymywany przez zamknięcie i nie zostanie zwolniony po zamknięciu.
class ViewController: UIViewController {
func fetchData() {
networkRequest { [weak self] data in
guard let self = self else { return }
self.updateUI(with: data)
}
}
func updateUI(with data: Data) {
// aktualizacja interfejsu
}
}
Tutaj weak self zapobiega silnemu cyklicznemu odniesieniu, ponieważ zamknięcie słabo przechwytuje self i nie utrzymuje obiektu, co pozwala na jego zwolnienie.