Sobes.tech
Junior — Middle

Могу ли настати потешкоће или неочекивано понашање ако једна од унутрашњих затварања у класи приступи њеним методама или својствима?

sobes.tech АИ

Одговор од АИ

Da, prilikom korišćenja zatvarača (closures) unutar klase u Swift-u, mogu se pojaviti poteškoće povezane sa hvatanjem self i mogućim ciklusima zadržavanja (retain cycles).

Ako zatvarač uhvati self bez korišćenja slabog ([weak self]) ili neimenovanog ([unowned self]) referenciranja, to može dovesti do toga da instanca klase neće biti oslobođena iz memorije, jer zatvarač drži jaku referencu na self, a self može držati zatvarač.

Primer problema:

class MyClass {
    var closure: (() -> Void)?
    var value = 10

    func setupClosure() {
        closure = {
            print(self.value) // hvatanje self
        }
    }

    deinit {
        print("MyClass je deinitializovan")
    }
}

var obj: MyClass? = MyClass()
obj?.setupClosure()
obj = nil // MyClass neće biti deinitializovan zbog ciklusa zadržavanja

Da biste to izbegli, koristite slab referencu:

closure = { [weak self] in
    guard let self = self else { return }
    print(self.value)
}

Stoga je važno pažljivo upravljati hvatanjem self u zatvaračima unutar klasa kako biste izbegli curenje memorije i neočekivano ponašanje.