我試圖通過異步調度隊列在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