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.