¿Cómo se quita un observador de un objeto bajo ARC ? ¿Simplemente agregamos el observador y nos olvidamos de eliminarlo? Si ya no gestionamos la memoria de forma manual, ¿dónde renunciamos a observar?
Por ejemplo, en un controlador de vista:
[self.view addObserver:self
forKeyPath:@"self.frame"
options:NSKeyValueObservingOptionNew
context:nil];
Anteriormente, llamaría removeObserver:al deallocmétodo del controlador de vista .

@"frame"lugar de@"self.frame"?Respuestas:
Aún puede implementar
-deallocbajo ARC, que parece ser el lugar apropiado para eliminar la observación de valores clave. Simplemente ya no llamas[super dealloc]desde este método.Si
-releaseantes anulabas , estabas haciendo las cosas de forma incorrecta.fuente
[super dealloc]. ¿Quién más debería hacer esto por ti?[super dealloc]a un método dealloc. No tengo idea de cómo funcionaría esto entonces al subclasificar la clase mencionada. Tal vez sea recomendable usarfinalizeen su lugar (donde llame[super finalize])[super dealloc]último en ese método es casi siempre un error en la administración de memoria manual, el compilador lo maneja por usted ahora, por lo que ya no puede llamar-deallocdirectamente. Lo único que coloca en un-deallocmétodo en ARC son los recursos que no son objetos que necesita liberar o tareas de limpieza como eliminar observadores. La redacción que usan es un poco turbia, pero esto es lo que querían decir.-finalizese usa para esto en la recolección de basura, donde-deallocnunca se llama, pero es perfectamente aceptable colocar este código en-deallocARC.[super dealloc]se llama automáticamente, por lo que es un error llamarlo bajo ARC.Lo hago con este codigo
- (void)dealloc { @try{ [self.uAvatarImage removeObserver:self forKeyPath:@"image" context:nil]; } @catch(id anException) { //do nothing, obviously it wasn't attached because an exception was thrown } }fuente
dealloc? Es demasiado tarde para hacer algo al respecto.En otra parte del desbordamiento de pila, Chris Hanson aconseja utilizar el método de finalización para este propósito e implementar un método de invalidación separado para que los propietarios puedan decirles a los objetos que están listos. En el pasado, encontré que las soluciones de Hanson estaban bien pensadas, así que seguiré con eso.
fuente
-deallocnunca se llama. En ARC, lo es. Es perfectamente aceptable eliminar a los observadores de KVO-dealloc, como indica Chris Lattner (quién sabe de qué está hablando) en los foros de desarrolladores de Apple aquí: devforums.apple.com/message/475850