dealloc à swift

Je voudrais effectuer un nettoyage à la fin de la vie d’un contrôleur de vue, à savoir pour supprimer une notification NSNotificationCenter . L’implémentation de dealloc entraîne une erreur de compilateur Swift:

 Cannot override 'dealloc' which has been marked unavailable 

Quelle est la manière préférée d’effectuer un nettoyage à la fin de la vie d’un object dans Swift?

 deinit { // perform the deinitialization } 

De la documentation de Swift :

Un désinitialiseur est appelé immédiatement avant qu’une instance de classe ne soit libérée. Vous écrivez des désinitialiseurs avec le mot-clé deinit, de la même façon que les initialisateurs sont écrits avec le mot-clé init. Les désinitialiseurs ne sont disponibles que sur les types de classe.

En règle générale, vous n’avez pas besoin d’effectuer de nettoyage manuel lorsque vos instances sont désallouées. Cependant, lorsque vous travaillez avec vos propres ressources, vous devrez peut-être effectuer vous-même un nettoyage supplémentaire. Par exemple, si vous créez une classe personnalisée pour ouvrir un fichier et y écrire des données, vous devrez peut-être fermer le fichier avant que l’instance de classe ne soit libérée.

 deinit { // perform the deinitialization } 

est la bonne réponse pour “dealloc” Swift.

Cependant, il est bon de souligner que dans iOS 9, NSNotificationCenter n’a plus besoin d’être nettoyé!

https://developer.apple.com/library/content/releasenotes/Foundation/RN-FoundationOlderNotes/index.html#X10_11Notes

NSNotificationCenter

Sous OS X 10.11 et iOS 9.0, NSNotificationCenter et NSDissortingbutedNotificationCenter n’enverront plus de notifications aux observateurs enregistrés susceptibles d’être libérés. Si l’observateur peut être stocké en tant que référence de remise à zéro, le stockage sous-jacent stockera l’observateur en tant que référence faible de mise à zéro, si l’object ne peut pas être stocké de manière faible de pouvoir stocker l’object faiblement), il stockera l’object comme une référence de remise à zéro non faible. Cela signifie que les observateurs ne sont pas tenus de se désinscrire dans leur méthode de désallocation. La prochaine notification qui serait acheminée à cet observateur détectera la référence mise à zéro et désenregistrer automatiquement l’observateur. Si un object peut être faiblement référencé, les notifications ne seront plus envoyées à l’observateur lors de la désallocation; le comportement précédent de recevoir des notifications pendant le dealloc est toujours présent dans le cas des observateurs de référence de la réduction à zéro non faiblement. Les observateurs basés sur des blocs via la méthode – [NSNotificationCenter addObserverForName: object: queue: usingBlock] doivent toujours être désinscrits lorsqu’ils ne sont plus utilisés car le système fait toujours référence à ces observateurs. La suppression prématurée des observateurs (référencés faiblement ou référencés) est toujours prise en charge. CFNotificationCenterAddObserver ne se conforme pas à ce comportement car l’observateur peut ne pas être un object.

mais notez les points ci-dessous concernant les références fortes, vous devrez donc vous soucier du nettoyage de toute façon …?

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html

Swift libère automatiquement vos instances quand elles ne sont plus nécessaires pour libérer des ressources. Swift gère la gestion de la mémoire des instances via le comptage automatique des références (ARC), comme décrit dans la section Comptage automatique des références. En règle générale, vous n’avez pas besoin d’effectuer de nettoyage manuel lorsque vos instances sont désallouées. Cependant, lorsque vous travaillez avec vos propres ressources, vous devrez peut-être effectuer vous-même un nettoyage supplémentaire. Par exemple, si vous créez une classe personnalisée pour ouvrir un fichier et y écrire des données, vous devrez peut-être fermer le fichier avant que l’instance de classe ne soit libérée.

Les définitions de classe peuvent avoir au plus un désinitialiseur par classe. Le désinitialisateur ne prend aucun paramètre et est écrit sans parenthèses:

  deinit { // perform the deinitialization } 

Soyez prudent lorsque vous appelez une méthode dans une autre classe à partir de deinit