Sobes.tech
Junior — Middle

Vai vari sniegt piemēru, kad Swift aizvēruma (closure) gadījumā ir nepieciešams izmantot weak self, lai novērstu cikliskas atsauces?

sobes.tech AI

Atbilde no AI

Swiftā cikliska atsauce rodas, kad objekts aizķeras pie sevis slēdzienā, un šis slēdzis tiek saglabāts tajā pašā objektā, kas noved pie savstarpējas noturēšanas un atmiņas noplūdes. Lai to novērstu, izmanto weak self.

Piemērs: jums ir klase ViewController, kas sāk asinhronu operāciju ar slēdzi. Ja slēdzienā tieši izmanto self, tad ViewController tiks noturēts ar slēdzi un netiks atbrīvots pēc aizvēršanas.

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) {
        // interfeisa atjaunināšana
    }
}

Šeit weak self novērš stipru ciklisku atsauci, jo slēdzis vājināti aizķer self un neuztur objektu, ļaujot tam tikt atbrīvotam.