Concurrency 使用dispatch\u async执行错误访问
我试图通过Objective-C++中的异步调度队列执行一个块。这是我想做的一个类片段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
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);
}
这是因为原始事件超出范围,这是未定义的行为。另一方面,如果创建副本,块也将创建副本。(理论上,它可以复制参考资料,但不是那样做的)