Sobes.tech
Junior — Middle

Des difficultés ou des comportements inattendus peuvent-ils survenir si l'une des fermetures internes d'une classe accède à ses méthodes ou propriétés?

sobes.tech IA

Réponse de l'IA

Oui, lors de l’utilisation de closures dans une classe pour accéder à ses méthodes ou propriétés, il peut y avoir des difficultés liées à la capture de self et à d’éventuels cycles de rétention (retain cycles).

Si une closure capture self sans utiliser de référence faible ou implicite ([weak self] ou [unowned self]), cela peut empêcher l’instance de la classe d’être libérée, car la closure maintient une référence forte à self, et self peut maintenir la closure.

Exemple du problème :

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

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

    deinit {
        print("MyClass désinitialisé")
    }
}

var obj: MyClass? = MyClass()
obj?.setupClosure()
obj = nil // MyClass ne sera pas désinitialisé à cause d’un cycle de rétention

Pour éviter cela, on utilise une référence faible :

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

Il est donc important de gérer attentivement la capture de self dans les closures au sein des classes pour éviter les fuites de mémoire et les comportements inattendus.