Question

J'ai un cas où la vue enfant envoie une notification à sa vue parent. J'appelle maintenant addObserver: dans viewWillAppear: et removeObserver: dans viewWillDisappear: . Mais je suppose que cela n’est pas correct puisque viewWillAppear: appelle lorsque la vue est actualisée.

[[NSNotificationCenter defaultCenter] addObserver: (id)observer selector: (SEL)aSelector name: (NSString *)aName object: (id)anObject];

[[NSNotificationCenter defaultCenter] removeObserver: (id)observer name: (NSString *)aName object: (id)anObject];

Merci.

Était-ce utile?

La solution

En fait, c’est une mauvaise idée. Lorsque la mémoire devient faible, votre contrôleur de vue peut recevoir un avertissement concernant la mémoire. Dans ce cas, le comportement par défaut consiste à vider votre écran (si vous n'êtes pas actuellement à l'écran). Dans ce cas, vous pourriez recevoir le message viewDidLoad envoyé une seconde fois (après l’événement de mémoire, lorsque votre vue est remise à l’écran par son contrôleur de navigation.) Ainsi, vous aurez deux enregistrements du même objet, mais une seule suppression. (dans son dealloc)

Une meilleure solution consiste à définir un indicateur indiquant que vous êtes inscrit ou à vous enregistrer dans votre méthode init.

Autres conseils

Je suppose que les positions correctes à enregistrer pour la notification sont la méthode viewDidLoad , et la position correcte pour annuler l'enregistrement des mêmes notifications est la méthode dealloc .

Ben a raison - mais j’en ai trouvé un autre, potentiellement fragile. Je viens de découvrir cela parce que je ne cessais de recevoir le message "... a été désalloué alors que des observateurs clés étaient encore enregistrés",

.

Je ne sais pas pourquoi - mais quand j'avais addObserver dans ma méthode init et removeObserver dans ma méthode dealloc - le message KVO était toujours en train d'être observé. J'ai vérifié et vérifié que mon serveur removeObserver était correctement appelé.

J'ai plutôt déplacé mon addobserver dans la méthode viewDidLoad, et cela a semblé fonctionner.

J'ai laissé un objet removeObserver dans viewDidUnload et dans dealloc; mais je n'aime pas ça parce que ce n'est pas équilibré. Mais dans des circonstances normales, mon viewDidUnload n'est pas appelé - il ne s'agit que d'une protection en cas de notification de mémoire insuffisante.

Mais je peux voir que, potentiellement, on se retrouve dans la situation où un événement de mémoire insuffisante arrive, viewDidUnload est appelé. Si je frappe ensuite dealloc un peu plus tard (avant d'appuyer à nouveau sur viewDidLoad), j'appellerai deux fois removeObserver!

Donc, je pense que je vais juste le garder dans mon point de vueDidLoad et mon dealloc.

Je ne sais toujours pas pourquoi cela ne fonctionne pas bien si je fais le addobserver dans ma méthode init.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top