2010-07-07 7 views
5

¿Está bien utilizar primero -removeObserver: y luego llamar al -addObserver: con el mismo nombre? ¿O es una regla tener -addObserver: primero antes de -removeObserver:?addobserver/removeobserver query

Lo probé usando OS 4.0 y parece estar bien (sin bloqueo, advertencias ... 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 razón es evitar que dos observadores con el mismo método que se llama dos veces selectorName asumiendo que -setObserver método fue llamado de nuevo si su interior -viewDidLoad y una advertencia de memoria se emitió.

Además, ¿necesito invocar -removeObserver: durante -dealloc?

+0

+1 buena pregunta. No sé si es seguro eliminar un observador que no estaba registrado anteriormente, pero sé que es imprescindible eliminarlo antes de destrabarlo. Para su caso dado, también podría eliminar el observador en viewDidUnload. Para eso es este método: Equilibrar todas las llamadas realizadas en loadView y viewDidLoad. – tonklon

Respuesta

3

Si obtiene -selectorName invocado dos veces, es probable que haya otro problema con su código. E incluso si Cocoa fuera elegante al eliminar observadores que aún no ha agregado, en realidad no lo haría.

Como dice el usuario tonklon en un comentario, probablemente debería eliminar al observador en -viewDidUnload. En cuanto a su última pregunta, también es razonable eliminar al observador en -dealloc, aunque es una buena práctica estructurar el código de modo que cosas como la eliminación de observadores sucedan en un momento determinista más que como un efecto secundario de la administración de memoria.