poligono para pairs librerias graficos graficas graficar grafica funcion ejemplos animados objective-c cocoa-bindings observer-pattern key-value-observing

objective c - para - ¿Cuándo debería eliminar observadores? Error al desasignar objetos antes de eliminar observadores



poligono en r (4)

¿Estás llamando [super dealloc] antes de eliminar a tus observadores? Llamar a dealloc de super demasiado pronto podría provocar un error como este.

Estoy tratando de usar 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.

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 de observación actual: (Contexto: 0x0, Propiedad: 0x536400> Contexto: 0x0, Propiedad: 0x55aba0>)

¿Hay alguna manera particular en que debería eliminar observadores? ¿O tal vez un lugar en particular en el que debería eliminarlos?

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

Aquí está 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 tener en cuenta que podría ser extraña acerca de mi implementación es que estoy agregando y quitando observadores del observado, ¿podría esto causar mi problema?


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

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

Si planeas observar un objeto que puede desaparecer antes de que el observador desaparezca, entonces necesitas una forma de notificar a los observadores que deben eliminar 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 TekkPoint se eliminarían como observadores.


El código normal se ve más o menos así:

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

Comprueba dos veces tu firma de tu método dealloc (Objective C es muy implacable y nunca te advertirá cuando desordenes 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 devolución de trato dealloc.


por qué llamarías

[super dealloc]

De la documentación de Apple sobre dealloc

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