Nous avons récemment révisé notre mécanisme de thread en faveur de l'utilisation de dispatch_async
dans la plupart des endroits (après avoir beaucoup lu sur NSOperation vs dispatch_async) *. Ensuite, notre code a commencé à s'écraser avec EXC_BAD_ACCESS dans différentes parties du code, toujours sur la partie dispatch_async(queue,...)
, sans motif clair. Généralement après 20 minutes - 2 heures.EXC_BAD_ACCESS lors de l'utilisation de dispatch_async
Nos dispatch_async
blocs ont été utilisés pour informer les auditeurs, se présente comme suit:
NSMutableSet *_listeners; // Initialised elsewhere and filled with interested listeners
void(^block)(id listener); // Block to execute
@synchronized(_listeners) {
for (id listener in _listeners) {
dispatch_async_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // We used different queues for different listeners, but showing only one type of queue here for brevity
dispatch_async(queue, ^{ // CRASHING LINE
block(listener);
});
}
}
y symptômes communs sont:
- Happens sur iOS10, ne se produit jamais sur iOS8
- Se produit pendant le débogage mais n'a jamais été signalé production n
(Ceci est une question d'auto-réponse)
* Nous avons aimé la simplicité de dispatch_async
, n'a pas besoin des fonctionnalités de blocage/dépendance de NSOperationQueue
« s et nous allons passer à C++ bientôt Je voulais donc rester bas niveau.
Pourriez-vous montrer un exemple de ce que vous faites dans votre 'dispatch_async'? – Oskar
@Oskar a ajouté le code –