2

我试图通过异步调度队列在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对象的方法呢?

谢谢!

回答

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); 
} 
+0

这是因为原始的事件超出范围,这是不确定的行为。另一方面,如果您制作副本,该块也会复制一份。 (理论上它*可以*制作参考文献的副本,但并非如此) – 2014-10-02 16:23:27

0

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