32

Estoy tratando de utilizar la observación de valores-clave en una de mis clases. Registré los observadores en el método init y los eliminé/eliminé en el dealloc, pero aparece el siguiente error que parece ocurrir antes de que se llame mi método dealloc, de acuerdo con mis impresiones de depuración.¿Cuándo debería eliminar observadores? Error al desasignar objetos antes de eliminar observadores

Una instancia 0x583870 de la clase TekkPoint se está desasignando mientras los observadores de valores clave aún están registrados con ella. La información de observación se está filtrando, e incluso se puede unir erróneamente a algún otro objeto. Establezca un punto de interrupción en NSKVODeallocateBreak para detenerse aquí en el depurador. Aquí está la información observación actual: ( Contexto: 0x0, propiedad: 0x536400> Contexto: 0x0, propiedad: 0x55aba0> )

¿Hay una manera particular, la haga quitar los observadores? ¿O tal vez un lugar en particular en el que debería eliminarlos?

De acuerdo con este question estoy haciendo las cosas bien, pero ¿por qué me sale este mensaje de error?

Aquí es mi rutina dealloc:

- (void)dealloc { 
    // Remove all observers. 
    for (NSString *path in [TekkPoint observedPaths]) { 
    [self removeObserver:[option_ tChart] 
      forKeyPath:path]; 

    } 

    [description_ release]; 
    [weight_ release]; 
    [super dealloc]; 
} 

Una cosa a destacar que podría ser extraño en mi aplicación es que estoy añadiendo y quitando los observadores del el observado, podría causar este mi problema?

Respuesta

46

Ah. Está observando un objeto TekkPoint desde un objeto SomethingElse, y el objeto SomethingElse es el que agrega y quita los observadores, ¿correcto? (Esa es la manera normal en que se hacen las cosas, solo estoy tratando de aclararlo.)

Parece que su objeto TekkPoint está siendo desasignado, mientras que el SomethingElse que lo está siguiendo todavía está disponible. No se llama al método dealloc SomethingElse porque es el TekkPoint el que está siendo desasignado, no el SomethingElse.

Si está planeando observar un objeto que puede desaparecer antes de que el observador desaparezca, entonces necesita alguna forma de notificar a los observadores que deben remover a sus observadores. Su TekkPoint podría tener una propiedad alive que también sería observada por SomethingElse, y cuando se establezca en NO, todos los que observen el TekkPoint se eliminarán como observadores.

+1

hombre esta respuesta acaba de salvar mi vida, usted el rey –

+0

simple y fácil. +1 – govi

+0

Otra opción es crear una referencia fuerte al objeto observado en el objeto que lo observa. De esta forma, el objeto observado no se liberará hasta que el observador también sea liberado. – Avario

2

¿Está llamando [super dealloc]antes de ¿quita sus observadores? Llamar a super's dealloc demasiado pronto podría generar un error como este.

+0

No, definitivamente tengo el orden correcto. [super dealloc] es lo último que llamo en mi dealloc. –

+0

Viejo hilo, pero acaba de encontrarlo. Sí, super dealloc definitivamente debería ser el último. – Ben

-10

El código normal se ve algo como esto:

- (void) dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 

revise su firma de su método dealloc (Objective C es muy implacable y nunca le avise cuando estropear el nombre de un método). Por ejemplo, si el nombre de su método era "dealoc" (con una l), nunca se llamaría a su dealloc.

De lo contrario, edite su pregunta para incluir su solicitud de dealloc.

+12

No relacionado con la observación del valor clave. – rpetrich

+0

Esta pregunta es para KVO no Notificaciones –

0

¿por qué te llame

[super dealloc] 

De la documentación manzana en dealloc

In an implementation of dealloc, do not invoke the superclass’s implementation 
+1

No necesita llamar solo cuando usa ARC, vea esta pregunta: http://stackoverflow.com/questions/9058428/documentation-about-dealloc –

Cuestiones relacionadas