2011-03-25 2 views
3

scénario Hypothétique:Ajout observateur à NSNotificationCenter deuxième fois provoque EXC_BAD_ACCESS

Dans ma méthode viewDidLoad J'ajoute contrôleur de vue comme un observateur de notification personnalisé (par exemple, la notification MyFooNotification). Plus tard dans le processus lorsque la vue est chargée, la notification est enregistrée et le contrôleur la traite. Lorsque je laisse le contrôleur avec sa vue, je ne retire pas l'observateur (intentionnellement) au viewDidUnload. La prochaine fois que vous ouvrez la vue, l'observateur est ajouté à nouveau, mais maintenant, lorsque la notification observée est affichée, j'obtiens EXC_BAD_ACCESS.

Quelqu'un peut-il expliquer pourquoi cela se produit.

P.S. Je sais que je devrais l'enlever dans viewDidUnload Je suis juste curieux au sujet des détails inférieurs.

+0

On dirait que quelque chose se libère qui ne devrait pas l'être. –

Répondre

5

Probablement parce que le contrôleur de vues d'origine a été désalloué car il a été déplacé d'une pile de navigation (ou similaire), mais NSNotificationCenter a toujours une référence à celui-ci. Ainsi, lorsque la notification est à nouveau affichée, NSNotificationCenter tente de notifier le contrôleur de vue désormais désalloué et obtient ainsi EXC_BAD_ACCESS.

Si vous jamais ont un objet lui-même ajouter à NSNotificationCenter à titre d'observateur, vous devez vous assurer que vous le retirez pendant dealloc.

Questions connexes