3

私はObjective-Cの部分をC++プロジェクトに混ぜています(クロスプラットフォームであるということについては議論しないでください)。
ここで、ココア環境の正しいスレッド(つまりメインスレッド)でいくつかのC++関数またはメソッドを呼び出したいと思います。

私の現在のアプローチは、関数ポインタをObjective-cインスタンス(から派生NSObject)に渡し、そのインスタンスでperformSelector/performSelectorOnMainThreadを実行することです。
しかし、performSelectorsは引数としてオブジェクトを期待しているので、通常はこれをどのようにラップしますか?

例:

 typedef void(*FnPtr)(void*);
 FnPtr fn;
 [someInstance performSelector:@selector(test:) withObject:fn];

...ここで、testは次のように宣言されています。

- (void)test:(FnPtr)fn;

今週はobjective-cから始めただけなので、もっと良い方法があれば、それについて聞いて喜んでいることを付け加えなければなりません。
また、プロジェクトはブラウザプラグイン(現在はMac上のSafariのみを対象としている)であるため、メインループやアプリケーションオブジェクトにアクセスできないことにも注意してください。

4

2 に答える 2

5

ここでsmorgan が回答したNSValueように、スカラー C および Objective-C 型のコンテナーとして設計されています。

- (void)test:(NSValue*)nv
{
    FnPtr fn = [nv pointerValue];
    // ...
}

// usage:
NSValue* nv = [NSValue valueWithPointer:fn];
[someInstance performSelector:@selector(test:) withObject:nv];
于 2009-11-12T00:41:33.240 に答える
0

私のソリューションが正気/正しいと見なされるかどうかはわかりませんが、ポインターを (id) に型キャストするだけで頻繁にポインターを渡します。それは汚いですが、私にとってはうまくいきます。おそらくよりクリーンな方法は、NSValue を使用することです。

于 2009-11-14T20:10:23.650 に答える