Concurrency 使用dispatch\u async执行错误访问

Concurrency 使用dispatch\u async执行错误访问,concurrency,objective-c++,grand-central-dispatch,objective-c-blocks,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->di

我试图通过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);
    }
}
我在dispatchEventToSubscribers方法中获得了EXC\u BAD\u访问权限。当我检查
\u dude
的值时,XCode告诉我它超出了范围。我只能假设我不知何故失去了这个。检查并发文档:

对于您计划执行的块 异步使用调度队列, 捕获标量变量是安全的 从父函数或方法和 在街区里使用它们。然而,你 不应试图捕捉大型 结构或其他基于指针的 分配的变量和 已被调用上下文删除。由 执行块时 该指针引用的内存可能会丢失 走吧。当然,这是安全的 分配内存(或对象) 你自己和你的手 该内存对块的所有权

那么,如何在
这个
对象上异步分派一个方法呢


谢谢

似乎没有问题。确保块执行时Blah实例处于活动状态。块自动保留Objective-C实例。不是C++实例。

由于某种原因,使一个本地实例“代码>事件< /代码>工作……我不知道为什么……………
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);
}

这是因为原始事件超出范围,这是未定义的行为。另一方面,如果创建副本,块也将创建副本。(理论上,它可以复制参考资料,但不是那样做的)