2010-07-07 12 views
5

Est-il correct d'utiliser -removeObserver: d'abord, puis appelez -addObserver: avec le même nom? Ou est-ce une règle d'avoir -addObserver: d'abord avant -removeObserver:?addobserver/removeobserver requête

Je l'ai essayé en utilisant OS 4.0 et il semble OK (pas de crash, mises en garde ... 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'empêcher deux observateurs avec la même méthode selectorName appelé deux fois en supposant que la méthode -setObserver a été appelé à nouveau si son intérieur -viewDidLoad et un avertissement de mémoire a été émis. De plus, dois-je appeler -removeObserver: pendant -dealloc?

+0

+1 bonne question. Je ne sais pas s'il vaut mieux supprimer un observateur qui n'était pas enregistré auparavant, mais je sais que c'est un must pour supprimer l'observateur avant de le libérer. Pour votre cas, vous pouvez également supprimer l'observateur dans viewDidUnload. C'est ce que cette méthode est pour: Équilibrer tous les appels effectués dans loadView et viewDidLoad. – tonklon

Répondre

3

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

Comme l'indique la tonklon de l'utilisateur dans un commentaire, vous devriez probablement supprimer l'observateur au -viewDidUnload. En ce qui concerne votre dernière question, il est également raisonnable de supprimer l'observateur dans -dealloc, bien que ce soit une bonne pratique de structurer votre code de sorte que la suppression des observateurs se produise à un moment déterministe plutôt que comme un effet secondaire de la gestion de la mémoire.