3

SOLVED - it turns out that passing nil to removeObserver:forKeyPath: fails, but ONLY in manual memory management. It works fine in garbage collected mode. The Apple documentation does NOT say it requires a non-nil value so I'm assuming it's a bug.Retrait observateur dealloc

J'ai un objet qui s'ajoute à titre d'observateur lui-même, par l'intermédiaire [self addObserver:self forKeyPath: etc. Dans ma méthode -dealloc (note que j'utilise garder compte et non le garbage collector) que j'appelle [self removeObserver:self forKeyPath:nil]; qui devrait marcher. Cependant, je reçois l'erreur suivante:

Cannot remove an observer <Snapshot 0x10047a6d0> for the key path "(null)" from <Snapshot 0x10047a6d0> because it is not registered as an observer. 

Maintenant, si je retire cette ligne de sorte qu'il ne se retire pas, je reçois ce message:

An instance 0x100193580 of class Snapshot was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info: 
<NSKeyValueObservationInfo 0x1001be2f0> (
<NSKeyValueObservance 0x1001a0a00: Observer: 0x100193580, Key path: fileURL, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x1001a02f0> 
) 

Alors ... l'objet est lui-même ... observer et pourtant ce n'est pas? : D Remarquez dans le second message que l'observateur a la même adresse que l'instance désaffectée, c'est donc bien le même objet.

La ligne [self removeObserver:self forKeyPath:nil]; travaillé avant lors de la collecte des ordures, lorsqu'il est appelé à partir -Finaliser mais pas maintenant de -dealloc en code managé manuellement.

Des pensées?

+0

Je suppose que par "mode de collecte des ordures" vous voulez dire réellement "Mode automatique de comptage de référence" (ARC). Veuillez corriger ceci dans votre question, car la collecte des ordures et l'ARC sont des choses complètement différentes. –

+0

Downvoting à cause de fausses instructions concernant la valeur 'nil' pour keyPath lors de la suppression des observateurs. –

Répondre

9

le chemin de clé devrait vraiment être nil? de documentation Apple:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html

The key path, relative to the receiver, of the property to observe. This value must not be nil.

+0

La documentation nécessite des valeurs non nulles pour les messages addObserver ..., mais pas pour supprimer les observateurs - le fait de passer nul enlève toutes les observations pour cet objet, au lieu d'avoir à les supprimer explicitement (il pourrait y en avoir plusieurs). –

+0

Cependant, malgré le fait que la documentation n'indique pas la nécessité de valeurs non-nulles pour removeObserver: forKeyPath :, il fonctionne en effet avec la clé passée au lieu de nil. Avec la collecte des ordures, rien ne fonctionne, mais en gestion manuelle, il n'y a aucun échec. Je pense que nous avons découvert un bug ... :) –

+0

Ah ok. Je ne savais pas que le chemin clé 'nil' de' removeObserver: forKeyPath: 'supprimait tous les chemins clés pour l'observateur. Est-ce documenté quelque part? Je ne peux pas le trouver. –