Sobes.tech
Junior — Middle

Ar galite pateikti pavyzdį, kada Swift uždarymo (closure) viduje reikia naudoti weak self, kad išvengtumėte ciklinių nuorodų?

sobes.tech AI

Atsakymas iš AI

Swift'e ciklinė nuoroda atsiranda, kai objektas įsikabina į save patį užrakto funkcijoje, ir ši užrakto funkcija yra saugoma tame pačiame objekte, kas sukelia tarpusavio išlaikymą ir atminties nutekėjimą. Norint to išvengti, naudojamas weak self.

Pavyzdys: turite klasę ViewController, kuri pradeda asinchroninę operaciją su užraktu. Jei užrake tiesiogiai naudojate self, tada ViewController bus išlaikomas užrako ir nebus atlaisvintas po uždarymo.

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) {
        // atnaujinti sąsają
    }
}

Čia weak self išvengia stiprios ciklinės nuorodos, nes užrake silpnai įsikabina į self ir nelaiko objekto, leidžiant jam būti atlaisvintam.