2010-04-29 5 views
0

Lorsque mon application est fermée, la classe du contrôleur principal se retire en tant qu'Observateur du modèle, puis libère le modèle. Comme ceci:KVO indique qu'un observateur KVO est enregistré même si ce n'est pas le cas (ou est-ce?)

- (void)dealloc { 
    [theModel removeObserver:self 
        forKeyPath:@"myValue"]; 
    [theModel release]; 
    [super dealloc]; 
} 

Et juste après, le débogueur dit:

2010-04-29 14: 07: 40,294 MyProgram [13678: a0f] Une instance 0x116f2e880 de classe TheModel a été libérée alors que les observateurs de la valeur-clé étaient encore enregistrés avec elle. L'information d'observation a été divulguée, et peut même devenir attachée par erreur à un autre objet. Définissez un point d'arrêt sur NSKVODeallocateBreak pour arrêter ici dans le débogueur. Voici les informations en cours d'observation:
< NSKeyValueObservationInfo 0x100288450 > (
< NSKeyValueObservance 0x1002aca90: Observateur: 0x116f40ec0, chemin clé: maValeur, Options: < Nouveau: OUI, Old: Prior: NO > Contexte: 0x0, propriété: 0x116f80430 >
)

0x116f2e880 est effectivement le modèle et 0x116f40ec0 est effectivement le contrôleur.

Comment le contrôleur peut-il encore être un observateur lorsqu'il vient de se retirer en tant qu'observateur?

+1

GDB ne dit pas cela; c'est la sortie de la console de votre programme. La sortie GDB ne comportera pas l'horodatage, le nom du programme, le PID et l'ID du thread. Le résultat provient de KVO lui-même, dans votre processus. J'ai corrigé le titre de la question en conséquence. –

Répondre

2

Ceci est juste une supposition, mais avez-vous ajouté le contrôleur en tant qu'observateur pour ce chemin de clé plus d'une fois? Peut-être avec différentes options ou contexte? Ou l'avez-vous ajouté en tant qu'observateur à un objet différent mais avec un chemin de clé qui se résout à l'objet du modèle? par exemple. si foo a une propriété theModel et que vous avez ajouté le contrôleur en tant qu'observateur à foo avec le chemin clé "theModel.myValue".

Pourriez-vous mettre un point d'arrêt sur -addObserver:forKeyPath:options:context: et voir ce qui est ajouté et quand?

+1

Dois-je supprimer explicitement les observateurs qui ont été ajoutés implicitement avec '+ keyPathsForValuesAffecting '? – bastibe

+0

Non, vous ne le faites pas. – ipmcc

Questions connexes