3

我正在尝试通过 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对象上异步调度方法呢?

谢谢!

4

2 回答 2

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);
}
于 2011-04-08T20:47:05.460 回答
0

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

于 2011-04-07T04:22:54.503 回答