Comment supprimer un observateur d'un objet sous ARC ? Ajoutons-nous simplement l'observateur et oublions-nous de le supprimer? Si nous ne gérons plus la mémoire manuellement, où démissionnerons-nous de l'observation?
Par exemple, sur un contrôleur de vue:
[self.view addObserver:self
forKeyPath:@"self.frame"
options:NSKeyValueObservingOptionNew
context:nil];
Auparavant, removeObserver:
j'appelais la dealloc
méthode du contrôleur de vue .
@"frame"
plutôt que@"self.frame"
?Réponses:
Vous pouvez toujours implémenter
-dealloc
sous ARC, qui semble être l'endroit approprié pour supprimer l'observation des valeurs clés. Vous n'appelez plus[super dealloc]
depuis cette méthode.Si vous étiez
-release
avant, vous faisiez les choses de la mauvaise façon.la source
[super dealloc]
. Qui d'autre devrait faire cela pour vous.[super dealloc]
une méthode dealloc. Aucune idée de comment cela fonctionnerait alors lors du sous-classement de la classe mentionnée. Peut-être qu'il est simplement conseillé d'utiliser à lafinalize
place (où vous appelez[super finalize]
)[super dealloc]
dernier dans cette méthode est presque toujours un bogue dans la gestion manuelle de la mémoire, le compilateur le gère pour vous maintenant, c'est pourquoi vous ne pouvez plus appeler-dealloc
directement. Les seules choses que vous mettez dans une-dealloc
méthode sous ARC sont toutes les ressources non-objet dont vous avez besoin pour libérer ou nettoyer des tâches telles que la suppression d'observateurs. Le libellé qu'ils utilisent est un peu confus, mais c'est ce qu'ils voulaient dire.-finalize
est utilisé pour cela sous garbage collection, où-dealloc
n'est jamais appelé, mais il est parfaitement acceptable de placer ce code-dealloc
sous ARC.[super dealloc]
est appelé automatiquement pour vous, c'est pourquoi c'est une erreur de l'appeler sous ARC.Je le fais avec ce code
la source
dealloc
? Il est trop tard pour faire quoi que ce soit.Ailleurs sur le débordement de pile, Chris Hanson conseille d'utiliser la méthode finalize à cet effet et d'implémenter une méthode invalider distincte afin que les propriétaires puissent dire aux objets qu'ils ont terminé. Dans le passé, j'ai trouvé que les solutions de Hanson étaient bien pensées, alors je vais y aller.
la source
-dealloc
n'est jamais appelé. Dans ARC, c'est le cas. Il est parfaitement acceptable de supprimer les observateurs du KVO dans-dealloc
, comme Chris Lattner (qui sait de quoi il parle) l'indique dans les forums de développeurs d'Apple ici: devforums.apple.com/message/475850