Sobes.tech
Junior — Middle

Podem ocorrer dificuldades ou comportamentos inesperados se um dos fechamentos internos de uma classe acessar seus métodos ou propriedades?

sobes.tech IA

Resposta da IA

Sim, ao aceder aos métodos ou propriedades de uma classe a partir de closures em Swift, podem surgir dificuldades relacionadas com a captura de self e possíveis ciclos de retenção (retain cycles).

Se uma closure captura self sem usar uma referência fraca ou implícita ([weak self] ou [unowned self]), isso pode impedir que a instância da classe seja libertada da memória, pois a closure mantém uma referência forte a self, e self pode manter a closure.

Exemplo do problema:

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

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

    deinit {
        print("MyClass desalojado")
    }
}

var obj: MyClass? = MyClass()
obj?.setupClosure()
obj = nil // MyClass não será desalojado devido a um ciclo de retenção

Para evitar isso, usa-se uma referência fraca:

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

Assim, é importante gerir cuidadosamente a captura de self em closures dentro de classes para evitar fugas de memória e comportamentos inesperados.