5 votes

Requête addobserver / removeobserver

Est-il possible d'utiliser -removeObserver: d'abord et ensuite appeler -addObserver: avec le même nom ? Ou est-ce une règle d'avoir -addObserver: d'abord avant -removeObserver: ?

Je l'ai essayé en utilisant l'OS 4.0 et cela semble correct (pas de crash, d'avertissements... etc.).

-(void) setObserver
{
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:OBSERVER_NAME object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector: @selector(selectorName)
                                             name:OBSERVER_NAME 
                                           object:nil]; 
}

La raison est d'éviter que deux observateurs avec la même selectorName qui est appelée deux fois en supposant que -setObserver a été appelée à nouveau si son intérieur -viewDidLoad et un avertissement de mémoire a été émis.

Aussi, dois-je invoquer -removeObserver: pendant -dealloc ?

3voto

Chris Hanson Points 34485

Si vous obtenez -selectorName invoqué deux fois, il y a probablement un autre problème avec votre code. Et même si Cocoa a la gentillesse de supprimer les observateurs que vous n'avez pas encore ajoutés, je ne le ferais pas.

Comme le dit l'utilisateur tonklon dans un commentaire, vous devriez probablement supprimer l'observateur dans le fichier -viewDidUnload . Pour ce qui est de votre dernière question, il est également raisonnable d'enlever l'observateur en -dealloc Cependant, il est bon de structurer votre code de telle sorte que des choses comme la suppression des observateurs se produisent à un moment déterministe plutôt que comme un effet secondaire de la gestion de la mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X