2

Je tente d'exécuter un bloc via une file d'attente de répartition asynchrone dans Objective-C++. Voici un fragment de classe de ce que je suis en train de faire ...EXC_BAD_ACCESS avec utilisation de dispatch_async

class Blah { 
public: 
    void dispatch(const EventPtr& event) { 
     dispatch_queue_t queue = dispatch_queue_create(_queueName.c_str(), NULL); 
     dispatch_async(queue, ^{ 
      this->dispatchEventToSubscribers(event); 
     }); 
     dispatch_release(queue); 
    } 
protected: 
    Dude _dude; 
    void dispatchEventToSubscribers(const EventPtr& event) { 
     _dude.dispatchToSubscribers(event); 
    } 
} 

je reçois un EXC_BAD_ACCESS dans la méthode de dispatchEventToSubscribers. Quand je vérifie pour voir quelle est la valeur de _dude, XCode me dit que c'est hors de portée. Je ne peux que supposer que je perds this en quelque sorte. Contrôle des accès concurrentiel docs:

Pour les blocs que vous prévoyez d'effectuer en mode asynchrone via une file d'attente d'envoi, il est sûr de capturer des variables scalaires de la fonction parent ou d'une méthode et les utiliser dans le bloc. Toutefois, ne doit pas tenter de capturer les grandes structures ou d'autres variables attribuées au pointeur et supprimées par le contexte appelant. Par le temps votre bloc est exécuté, la mémoire référencée par ce pointeur peut être disparu. Bien sûr, il est sûr d'allouer de la mémoire (ou un objet) et de transférer explicitement la propriété de cette mémoire au bloc.

Alors comment envoyer une méthode asynchrone sur this objet?

Merci!

Répondre

5

Pour une raison quelconque, ce qui rend une instance locale de event travaillé ... Je ne sais pas pourquoi ... .. à savoir

void dispatch(const EventPtr& event) { 
    dispatch_queue_t queue = dispatch_queue_create(_queueName.c_str(), NULL); 
    EventPtr eventPtr = event; //local instance... 
    dispatch_async(queue, ^{ 
     this->dispatchEventToSubscribers(eventPtr); 
    }); 
    dispatch_release(queue); 
} 
+0

C'est parce que l'événement d'origine est hors de portée, ce fut un comportement non défini . D'un autre côté, si vous faites une copie, le bloc en fera également une copie. (en théorie il * pourrait * faire une copie de la référence, mais cela n'a pas été fait de cette façon) –

0

Il semble qu'il n'y ait aucun problème. Assurez-vous que l'instance Blah est active lorsque le bloc s'exécute. Blocs conserve automatiquement les instances Objective-C. pas pour les instances C++.

Questions connexes