2009-11-30 60 views
0

尝试将纯C/C++代码作为外部静态库集成到iPhone项目中。到目前为止这么好,但现在我卡在一个点,我需要寄存器库回调。图书馆应该在发生事情时通知我的iPhone应用程序。似乎是一个定义代表的好地方。作为iPhone委托协议的一部分的Plain C回调函数指针?

...但库期待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类的方法都有两个隐藏的参数。不知道如何处理这一点。除了更改该外部库的接口外。

回答

4

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

+0

读这么多次,每次理解多一点:)想知道如何做**“内部委托调用你的Objective-C代码“**?看单身设计模式,很多工作。还有其他方法吗? – JOM 2009-12-03 11:54:06

+0

如果你可以调用C++类,这个类的实现可以包含Objective-C代码 - 所以你可以调用例如Objective-C类中,您的C++实例包含“id”或类似的。这实际上取决于所提及的能力以及周围的环境和特定的用例:) – 2009-12-03 16:21:16

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... 

[更新:广发点你可以使用一个类的方法,并避免需要setCallbackDelegate。]