32 votes

Quand devrais-je retirer les observateurs? Erreur de désallocation d'objets avant de supprimer des observateurs

Je suis en train d'utiliser la touche de la valeur de l'observation à l'une de mes classes. - Je enregistrer les observateurs dans la méthode init et supprimer/se désinscrire dans le dealloc, mais j'obtiens l'erreur suivante qui semble se produire avant que mon dealloc méthode est appelée, selon mon debug imprime.

Une instance 0x583870 de classe TekkPoint est libérée, tandis que la valeur de la clé observateurs sont toujours enregistrés avec elle. L'Observation de l'info, c'est la fuite, et peut même devenir, à tort, attaché à un autre objet. Définissez un point d'arrêt sur NSKVODeallocateBreak de s'arrêter là dans le débogueur. Voici l'observation courante info: ( Contexte: 0x0, la Propriété: 0x536400> Contexte: 0x0, la Propriété: 0x55aba0> )

Est-il une manière particulière, je devrais supprimer les observateurs? Ou peut-être un endroit en particulier que je devrais les enlever?

Conformément à cette question , je suis en train de faire des choses bien, mais pourquoi j'obtiens ce message d'erreur?

Voici mon dealloc routine:

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

  }

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

Une chose à noter, que peut-être étrange à propos de mon œuvre, c'est que je suis l'ajout et la suppression des observateurs de la observee, cela pourrait-il la cause de mon problème?

46voto

BJ Homer Points 29168

Ah. Vous observez un TekkPoint objet à partir d'un SomethingElse de l'objet et l' SomethingElse objet est celui de l'ajout et de retrait de la qualité d'observateurs, correct? (C'est la façon normale de faire les choses; je suis juste en train de le préciser.)

Il ressemble au votre, TekkPoint objet est libéré alors que l' SomethingElse c'est l'observation, il est toujours là. L' SomethingElse dealloc méthode n'est pas appelée parce que c'est l' TekkPoint qui est désalloué, pas le SomethingElse.

Si vous prévoyez sur l'observation d'un objet qui peut disparaître avant l'observateur disparaît, alors vous avez besoin de quelque façon de prévenir les observateurs qu'ils devraient retirer leurs observateurs. Votre TekkPoint pourrait avoir un alive de la propriété, ce qui serait observé par l' SomethingElse, et quand il est défini à l' NO alors tout le monde en observant l' TekkPoint seraient supprimer lui-même en tant qu'observateur.

2voto

BJ Homer Points 29168

Appelez-vous [super dealloc] avant de retirer vos observateurs? Appeler trop tôt les super-héros dealloc pourrait conduire à une telle erreur.

0voto

user2880079 Points 1

pourquoi appellerais-tu

 [super dealloc]
 

De la documentation Apple sur le dealloc

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

-11voto

Peter N Lewis Points 12025

Le code normal ressemble à ceci:

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

Revérifiez votre signature de votre méthode dealloc (Objective C est très impitoyable et ne vous préviendra jamais lorsque vous foirez le nom d'une méthode). Par exemple, si le nom de votre méthode était "dealoc" (avec un l), votre dealloc ne serait jamais appelée.

Sinon, modifiez votre question pour inclure votre reoutine dealloc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X