我试图通过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_BAD_ACCESS。当我检查_dude
的值是什么时,XCode告诉我它超出了范围。我只能假设我以某种方式失去this
。检查并发文档:
对于您计划执行的块 使用调度队列异步, 捕获标量变量是安全的 来自父函数或方法 在块中使用它们。但是,你 不应该试图捕捉大 结构或其他基于指针的 分配的变量和 被调用上下文删除。由 你的块被执行的时间, 该指针引用的内存可能 走了当然,这是安全的 分配内存(或对象) 你自己并明确地交出来 该内存对块的所有权。
那么如何在this
对象上异步调度方法?
谢谢!
答案 0 :(得分: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);
}
答案 1 :(得分:0)
似乎没有问题。执行块时,确保Blah实例处于活动状态。 Blocks自动保留Objective-C实例。不适用于C ++实例。