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インスタンスが有効であることを確認してください。ブロックは自動的にObjective-Cインスタンスを保持します。C++インスタンス用ではありません。

于 2011-04-07T04:22:54.503 に答える