1

私の背景経験は C/C++/C# です。

xcode プロジェクトで C++ ライブラリを使用しています (具体的には、ライブラリは PJSIP です)。ライブラリを使用するには、次のようにいくつかのコールバックをコードに配線する必要があります。

SipTest.m

#include < pjsua-lib/pjsua.h >

static void on_reg_state(pjsua_acc_id acc_id)
{
    // Do work
} 

static void Init()
{
   // pjsua_config and psjua_config_default are  defined in the header file from pjsip
    pjsua_config cfg;            
    psjua_config_default(&cfg);  

    cfg.cb.on_regstate = &on_reg_state;
 }

この C++ 構文を Objective C に切り替えたい

だから私はした:

 +(void) on_reg_state:(pjsua_acc_id) acc_id
 {
    // Do work
 } 

 +(void) Init
 {
    pjsua_config cfg;            
    psjua_config_default(&cfg);  

    cfg.cb.on_regstate = &on_reg_state; // ***** this is causing compile error
                                        // I tried [CLASS NAME on_reg_state] and i get   runtime error
 }

Objective C でデリゲートを検索しようとしましたが、コールバックが既に C++ で実装されていて、Objective-C 構文で使用したいという同様のケースを見つけることができませんでした。

ありがとう

4

2 に答える 2

2

まず、何も変換する必要はまったくありません。Objective-C から C++ ライブラリを呼び出すことはまったく問題ありません。

次に、コンパイラ エラーの原因は、関数ポインタがあるはずの場所にメソッドを貼り付けようとしていることにあります。&Operatorを使用して、Objective-C メソッドから関数ポインターを作成することはできません。関数を保持on_reg_state()し、以前と同じように使用するだけです。これは、Apple の C ベースのフレームワークでもコールバックを行う方法です (高レベルの Objective-C API が提供するものを超えるとすぐに必要になります)。

そして第三に、あなたの+ (void)Init方法は少し奇妙に思えます。Init(capitalized)というメソッドを作成することは強くお勧めしません。イニシャライザを作成する場合は- (id)init、 、つまり小文字で を返す必要がありidます。initまた、そのスーパークラスの指定された初期化子を呼び出し、その戻り値を確認し、それを自分自身に割り当てて、メソッドの最後で返すことを忘れないでください(詳しくない場合は、Apple のドキュメントの初期化子の実装を参照してください)。 . また、メソッドが初期化子でない場合は、別の名前を使用してください。- (void)createConfig

于 2011-06-17T19:18:56.327 に答える
0

この場合、セレクターを使用します。

+(void) on_reg_state:(pjsua_acc_id) acc_id
 {
    // Do work
 } 

 +(void) Init
 {
    pjsua_config cfg;            
    psjua_config_default(&cfg);  

    cfg.cb.on_regstate_selector = @selector(on_reg_state:);
    cfg.cb.target = self; //Self here is the class object in your 'Init' method, which is poorly named.
    //Use this like [cfg.cb.target performSelector:cfg.cb.on_regstate_selector withObject:...etc]

 }
于 2011-06-17T19:18:35.487 に答える