web-dev-qa-db-fra.com

Publication de NSNotificationCenter provoquant l'exception "EXC_BAD_ACCESS"

Un UIViewController s'ajoute au centre par défaut:

[[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(editFood)
 name:@"editFood"
 object:nil];

Un UITableView délégué NSObject publie un NSNotification:

[[NSNotificationCenter defaultCenter]
 postNotificationName:@"editFood"
 object:self];

Pendant l'exécution, il obtient une exception EXC_BAD_ACCESS.

Le defaultCenter est-il sorti quelque part? Le même concept fonctionne lorsque je poste une notification à un UIViewController à partir d'un UIViewController, mais cela ne devrait pas avoir d'importance, non?

62
Paul Jordan

Un de vos abonnés a été désalloué. Assurez-vous d'appeler [[NSNotificationCenter defaultCenter] removeObserver:self] dans votre dealloc (sinon plus tôt).

128
Ben Scheirman

EXC_BAD_ACCESS peut se produire même après avoir vérifié que dealloc existe comme ceci:

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self]
}

Ce qui précède résoudra le problème la plupart du temps, mais apparemment, ma cause était que j'ajoutais indirectement l'observateur avec un selector: défini sur nil comme suit:

[NSNotificationCenter.defaultCenter addObserver:self
                                         selector:nil
                                             name:notificationName
                                           object:nil];

... donc quand j'ai posté quelque chose avec ça notificationName, EXC_BAD_ACCESS eu lieu.

La solution était d'envoyer un sélecteur qui pointe réellement vers quelque chose.

10
kraftydevil