SOLVED - it turns out that passing
nil
toremoveObserver: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?
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. –
Downvoting à cause de fausses instructions concernant la valeur 'nil' pour keyPath lors de la suppression des observateurs. –