Pregunta ¿Cuándo debería eliminar observadores? Error al desasignar objetos antes de eliminar observadores


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 a esto pregunta Estoy haciendo las cosas bien, pero ¿por qué recibo 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?


32
2018-06-13 05:46


origen


Respuestas:


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

Parece que tu TekkPoint objeto está siendo desasignado mientras el SomethingElse eso es observar que todavía está alrededor. los SomethingElse El método dealloc no se llama porque es el TekkPoint eso 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. Tu TekkPoint podría tener un alive propiedad que también sería observada por el SomethingElsey cuando se establece en NO entonces todos observando el TekkPoint se eliminaría a sí mismo como un observador.


46
2018-06-13 18:22



Estás llamando [super dealloc]  antes de ¿Quitas a tus observadores? Llamando super dealloc Demasiado temprano podría dar lugar a un error como este.


2
2018-06-13 07:08



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

0
2018-05-14 15:30



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.


-10
2018-06-13 09:04