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++ sytnax 切换到 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++ 库是非常好的。

其次,导致编译器错误的原因是您试图将方法粘贴在应该有函数指针的地方。您不能使用&运算符从 Objective-C 方法中创建函数指针。只需保留您的on_reg_state()函数并像以前一样使用它,这也是您在 Apple 的基于 C 的框架中执行回调的方式(一旦您超越了高级 Objective-C API 提供的功能,您将需要它)。

第三,你的+ (void)Init方法似乎有点奇怪。我强烈建议您编写一个名为Init(大写)的方法。如果您打算编写一个初始化程序,它应该是- (id)init,即小写并返回id。并且不要忘记调用其超类的指定初始化器,检查其返回值,将其分配给 self,并在方法结束时返回它(如果您不熟悉,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 回答