我试图通过异步调度队列在Objective-C++中执行一个块。下面是我想要做的一类片段...EXC_BAD_ACCESS使用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);
}
}
我得到的dispatchEventToSubscribers方法中的EXC_BAD_ACCESS。当我检查_dude
的值时,XCode告诉我它已超出范围。我只能假设我以某种方式失去了this
。检查并发文档:
对于计划使用异步调度队列执行 块, 可以安全地从父函数或方法捕捉标量变量 和 块中使用它们。但是, 不应尝试捕获分配的大型 结构或其他基于指针的 变量,并且将调用上下文删除 。在执行块时, 指针引用的内存可能会丢失。当然, 自己分配内存(或对象) 是安全的,并明确地将该内存的所有权移交给该块。
那么我该如何异步调度this
对象的方法呢?
谢谢!
这是因为原始的事件超出范围,这是不确定的行为。另一方面,如果您制作副本,该块也会复制一份。 (理论上它*可以*制作参考文献的副本,但并非如此) – 2014-10-02 16:23:27