87 votes

KVO et ARC Comment removeObserver

Comment supprimer un observateur d'un objet sous ARC ? Devons-nous simplement ajouter l'observateur et oublier de l'enlever? Si nous ne gérons plus la mémoire manuellement, où devons-nous nous retirer de l'observation?

Par exemple, sur un contrôleur de vue:

 [self.view addObserver:self
            forKeyPath:@"self.frame"
               options:NSKeyValueObservingOptionNew 
               context:nil];
 

Auparavant, je qualifierais removeObserver: dans le contrôleur de vue dealloc méthode.

126voto

Brad Larson Points 122629

Vous pouvez toujours implémenter -dealloc sous ARC, qui semble être l'endroit approprié pour supprimer l'observation des valeurs de clé. Vous n’appelez plus [super dealloc] depuis cette méthode.

Si vous surchargiez -release auparavant, vous agissiez mal.

0voto

user3461902 Points 13

Je le fais avec ce code

 - (void)dealloc
{
@try{
    [self.uAvatarImage removeObserver:self forKeyPath:@"image" context:nil];
} @catch(id anException) {
    //do nothing, obviously it wasn't attached because an exception was thrown
}
}    
 

-2voto

Elise van Looij Points 2254

Ailleurs en cas de débordement de pile, Chris Hanson recommande d'utiliser la méthode finalize à cette fin et de mettre en œuvre une méthode d'invalidation distincte afin que les propriétaires puissent dire aux objets qu'ils sont terminés. Dans le passé, j’ai trouvé les solutions de Hanson bien pensées, je vais donc y aller.

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