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++實例。