69 votes

Post de NSNotificationCenter provoquant l'exception "EXC_BAD_ACCESS

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

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

Dans ce cas, un UITableView delegate NSObject posts a NSNotification :

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

En cours d'exécution, il reçoit un EXC_BAD_ACCESS exception.

Est-ce que le defaultCenter va-t-elle être publiée quelque part ? Le même concept fonctionne lorsque j'envoie une notification à un UIViewController depuis un UIViewController, mais cela ne devrait pas avoir d'importance, n'est-ce pas ?

0 votes

Où se produit-il exactement ?

3 votes

Ajoutant [[NSNotificationCenter defaultCenter] removeObserver:self] a -(void)dealloc{} dans votre Scène résoudra probablement ce problème. Cela a fonctionné pour moi ; j'avais le même problème que vous. Je vous souhaite bonne chance !

131voto

Ben Scheirman Points 23590

Un de vos abonnés a été désaffecté. Veillez à appeler [[NSNotificationCenter defaultCenter] removeObserver:self] dans votre dealloc (si ce n'est pas plus tôt).

3 votes

Merci, je viens de me rendre compte de mon erreur (après avoir regardé cela et fait des recherches pendant quatre heures). L'objet que j'essayais de référencer après l'appel avait été libéré. Le débogueur donnait l'impression que c'était là que l'exception EXC_BAD_ACCESS était levée.

4 votes

@Paul : L'instrument Zombies est très utile pour résoudre ce genre de problème.

0 votes

@Sven Merci, j'apprécie. J'ai en fait essayé d'utiliser cela une fois, et je n'ai pas réussi à comprendre comment. J'ai ajouté une variable d'environnement dans la liste de contrôle du projet, mais cela n'a pas fonctionné.

11voto

kraftydevil Points 612

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

- (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 à l'aide d'une fonction selector: fixé à nil comme suit :

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

...alors quand j'ai posté quelque chose avec ça notificationName , EXC_BAD_ACCESS s'est produite.

La solution consistait à envoyer un sélecteur qui pointe réellement vers quelque chose.

1 votes

Oui, je viens de le découvrir moi-même, j'avais mis NULL en tant que sélecteur dans l'intention qu'il soit temporaire, comme oh laissez-moi créer cette méthode, puis j'ai oublié de mettre à jour le paramètre du sélecteur plus tard (DOH) et yep, EXC_BAD_ACCESS résultat.

1voto

pableiros Points 4682

J'ai rencontré le même problème dans Swift . Le problème est que la fonction cible a un closure avec la valeur par défaut :

@objc func performFoo(completion: (() -> Void)? = nil) {
   ...
}

Après avoir remplacé le closure avec un paramètre Notification il a fonctionné :

@objc func performFoo(notification: Notification) {
    ...
}

J'ai dû faire quelques modifications pour qu'il fonctionne correctement.

0voto

ACLima Points 21

Si vous obtenez cette erreur et que vous utilisez async/await, vérifiez si cet autre problème n'en est pas la cause. https://stackoverflow.com/a/76066999/2828729

tl;dr : au moment de la rédaction du présent document @objc et les sélecteurs async les méthodes ne vont pas bien ensemble

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