使用dispatch_async的EXC_BAD_ACCESS

Tim*_*ddy 3 concurrency objective-c++ grand-central-dispatch objective-c-blocks

我试图通过Objective-C++中的异步调度队列来执行一个块.这是我正在尝试做的一个类片段......

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在dispatchEventToSubscribers方法中获得了EXC_BAD_ACCESS.当我检查是什么值时_dude,XCode告诉我它超出了范围.我只能假设我在this某种程度上失败了.检查并发文档:

对于计划使用调度队列异步执行的块,可以安全地从父函数或方法捕获标量变量,并在块中使用它们.但是,您不应尝试捕获由调用上下文分配和删除的大型结构或其他基于指针的变量.在块执行时,该指针引用的内存可能会消失.当然,自己分配内存(或对象)并明确地将该内存的所有权移交给块是安全的.

那么如何在this对象上异步调度方法呢?

谢谢!

Tim*_*ddy 5

出于某种原因,制作一个有效的本地实例event...我不知道为什么...即......

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);
}
Run Code Online (Sandbox Code Playgroud)