Sobes.tech
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.