2012-07-18 3 views
3

Je suis en cours addObserver:selector:name:object: en viewDidLoad. J'utilise removeObserver:name:object: dans viewWillDisappear:animated: pour supprimer l'observateur.Les observateurs seront-ils automatiquement supprimés lorsque les observateurs deviendront nuls?

Que se passera si je ne supprimer observateur par le passage de paramètres erroné de removeObserver:name:object:?
(Par exemple, l'observateur n'est pas supprimé si je passe mal notification au paramètre name ou mauvais objet à object ou Observer)

Si l'observateur toujours pas nul après avoir appelé removeObserver:name:object:, je peux constater que la suppression a échoué parce que l'observateur notificationSelector sera appelé.

Mais si l'observateur se nul après avoir appelé removeObserver:name:object:, je ne peux pas savoir si le retrait observateur a échoué ou non.

Est-ce que les observateurs enlevés automatiquement observateur deviennent nulles?
Ou est-notification dispatch table de NSNotificationCenter est devenu plus grand et, finalement, l'application devient lente?

EDIT

Lorsque j'utilise la sous-classe d'objet UIViewController pour l'observateur, l'application ne tombe pas en panne après dealloc de ViewController sont appelés.
Mais quand j'utilise un objet d'une autre classe, l'application heurtes après dealloc de l'objet sont appelés.

Répondre

10

Mise à jour: De -[NotificationCenter removeObserver:]:

Si vos cibles d'applications iOS 9.0 et versions ultérieures ou 10.11 et macOS plus tard, vous n'avez pas besoin de désenregistrer un observateur dans sa méthode dealloc. Dans le cas contraire, vous devez appeler cette méthode ou removeObserver:name:object: avant observateur ou tout autre objet spécifié dans addObserverForName:object:queue:usingBlock: ou addObserver:selector:name:object: est désalloué.

ancienne réponse:

Les observateurs ne sont pas supprimés automatiquement. De la NSNotificationCenter Référence de la classe:

Important: Le centre de notification ne conserve pas ses observateurs, donc, vous devez vous assurer que vous annulez l'enregistrement des observateurs (en utilisant removeObserver: ou removeObserver: Nom: objet :) avant qu'ils ne soient désaffecté. (Si vous ne le faites pas, vous allez générer une erreur d'exécution si le centre envoie un message à un objet libéré.)

Vous devez donc appeler

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

dans votre méthode dealloc si vous êtes pas sûr à 100% que l'observateur n'a pas été retiré précédemment.

+0

merci. J'ai trouvé que si j'utilise la sous-classe de UIViewController en tant qu'observateur, l'erreur d'exécution ne se produit pas. Si j'utilise l'objet d'une autre classe en tant qu'observateur, une erreur d'exécution se produit. Peut-être, UIViewController appelle 'removeObserver: self' dans son' dealloc'. Mais je ne sais pas comment vérifier si super classe vraiment enlevé l'observateur. –

+0

J'ai googlé votre citation de la référence (?), Mais je n'ai pas pu la trouver, donc c'est probablement de l'ancienne information. Maintenant, il semble que ce soit encore correct à ce moment-là; NSNotificationCenter ne conserve pas l'observateur, car je fais appel à dealloc sur un objet sans même le supprimer en tant qu'observateur. Maintenant, bien sûr, la bonne chose serait de l'enlever dans dealloc selon cette réponse. La documentation n'indique toujours pas si l'observateur est retenu ou non et est donc un peu OMI peu clair. – Jonny

0

Vous avez juste besoin de mettre dans l'observateur correct pour l'observateur à supprimer. Si vous passez un mauvais paramètre à un nom ou à un objet (ou nul), le destinataire ne les utilisera pas comme critère de suppression.

Tous les programmes Cocoa ont un NSNotificationCenter par défaut, donc une fois que vous avez supprimé les observateurs, vous ne devriez pas avoir à vous soucier de l'occuper plus de mémoire.

Questions connexes