使用dispatch_async的EXC_BAD_ACCESS

时间:2011-04-05 19:08:00

标签: 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->dispatchEventToSubscribers(event); 
        });
        dispatch_release(queue);
    }
protected:
    Dude _dude;
    void dispatchEventToSubscribers(const EventPtr& event) {
        _dude.dispatchToSubscribers(event);
    }
}

我在dispatchEventToSubscribers方法中获得了EXC_BAD_ACCESS。当我检查_dude的值是什么时,XCode告诉我它超出了范围。我只能假设我以某种方式失去this。检查并发文档:

  

对于您计划执行的块   使用调度队列异步,   捕获标量变量是安全的   来自父函数或方法   在块中使用它们。但是,你   不应该试图捕捉大   结构或其他基于指针的   分配的变量和   被调用上下文删除。由   你的块被执行的时间,   该指针引用的内存可能   走了当然,这是安全的   分配内存(或对象)   你自己并明确地交出来   该内存对块的所有权。

那么如何在this对象上异步调度方法?

谢谢!

2 个答案:

答案 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 ++实例。