普通C回调函数指针作为iPhone委托协议的一部分?

时间:2009-11-30 12:34:52

标签: c++ objective-c iphone-sdk-3.0 callback

尝试将普通的C / C ++代码集成到iPhone项目中作为外部静态库。到目前为止一切顺利,但现在我陷入困境,我需要注册库回调。当事情发生时,库应通知我的iPhone应用程序。似乎是定义代表的好地方。

...但是库期待回调的C函数指针。如何在 Objective-C 中定义它们,如何将它们用作委托模式的一部分?

抱歉,真的不能给出示例代码。这里有点类似:第一个接口我用来注册,然后是回调的定义。

registerCallBack(&aCBack, &bCBack, &cCBack, &dCBack, &eCBack);

typedef void (aCBack)(uint32_t magic);
typedef void (bCBack)(const NewData* newData);
typedef void (cCBack)(uint32_t value, const std::vector<DataStuff*>* stuff);
typedef void (dCBack)(uint32_t value, const SomeData* data, const std::string text, uint32_t type);
typedef void (eCBack)(uint32_t value, const MoreData* more);

...哦顺便说一下,其中一个问题是每个Objective-C类方法都有两个隐藏的参数。根本不确定如何处理。除了改变外部库的界面外。

2 个答案:

答案 0 :(得分:4)

您需要使用C ++ / C接口进行回调,然后在内部将调用委托给您的Objective-C代码。如果回调注册允许您传递足够大小的用户数据,您可以方便地传递标识您的上下文的内容,如this answer中所示。
无法通过任何上下文传递的回调无论如何都必须调用Objective-C部件的类方法。

答案 1 :(得分:2)

你必须使用普通的C函数,但只要你编译为Objective-C,你就可以从它们调用你的委托对象:

// need to have a reference to the object, of course
static DelegateClass* delegate = NULL;

// call at runtime with your actual delegate
void setCallbackDelegate ( DelegateClass* del ) { delegate = del; }

void callbackA ( uint32_t magic )
{
    [delegate handleCallbackA:magic];
}

// and so on...

[更新:正如gf指出的那样,您可以使用类方法并避免使用setCallbackDelegate。]