¿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 dealloc
método del controlador de vista .
@"frame"
lugar de@"self.frame"
?Respuestas:
Aún puede implementar
-dealloc
bajo 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
-release
antes 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 usarfinalize
en 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-dealloc
directamente. Lo único que coloca en un-dealloc
mé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.-finalize
se usa para esto en la recolección de basura, donde-dealloc
nunca se llama, pero es perfectamente aceptable colocar este código en-dealloc
ARC.[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
-dealloc
nunca 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