Pregunta

Tengo un caso en el que la vista secundaria envía una notificación a su vista principal. Ahora estoy llamando a addObserver: en viewWillAppear: y removeObserver: en viewWillDisappear: . Pero supongo que esto no es correcto ya que viewWillAppear: llama cuando la vista se actualiza.

[[NSNotificationCenter defaultCenter] addObserver: (id)observer selector: (SEL)aSelector name: (NSString *)aName object: (id)anObject];

[[NSNotificationCenter defaultCenter] removeObserver: (id)observer name: (NSString *)aName object: (id)anObject];

Gracias.

¿Fue útil?

Solución

En realidad, esta es una mala idea. Cuando la memoria se agota, su controlador de vista puede recibir una advertencia de memoria. El comportamiento predeterminado en esta instancia es borrar su vista (si no está actualmente en la pantalla). En este caso, puede recibir el mensaje viewDidLoad una segunda vez (después del evento de memoria, cuando el controlador de navegación vuelve a mostrar la pantalla). Por lo tanto, tendrá dos registros del mismo objeto, pero solo una eliminación. (en su dealloc)

Una mejor solución es establecer una marca que indique que te has registrado o registrarte en tu método de inicio.

Otros consejos

Supongo que las posiciones correctas para registrarse para la notificación es el método viewDidLoad , y la posición correcta para cancelar el registro de las mismas notificaciones es el método dealloc .

Ben tiene razón, pero encontré otra, potencialmente frágil, alrededor de eso. Acabo de descubrir esto porque siempre recibí el " ... fue desasignado mientras los observadores de valor clave aún estaban registrados con él "

No sé por qué, pero cuando tenía addObserver en mi método init y removeObserver en mi método dealloc, todavía estaba recibiendo el mensaje de KVO. Pasé y verifiqué que mi removeObserver estaba siendo llamado correctamente.

En su lugar, moví mi addobserver al método viewDidLoad, y eso pareció funcionar.

Dejé un removeObserver en viewDidUnload y en dealloc; Pero no me gusta eso porque no está equilibrado. Pero en circunstancias normales, no se llama a mi viewDidUnload; esto es solo protección en caso de que reciba una notificación de memoria baja.

Pero puedo ver potencialmente entrar en la situación en la que entra un evento de poca memoria, se llama a viewDidUnload. Si luego presiono Dealloc en algún momento después de eso (antes de que golpee viewDidLoad nuevamente), ¡llamaré removeObserver dos veces!

Por lo tanto, creo que solo lo mantendré en mi viewDidLoad, y mi dealloc.

Todavía no sé por qué no funciona bien si hago el addobserver en mi método de inicio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top