C++和Objective C之间的事件处理

7
我最近开始开发一款iOS游戏,并决定用C++编写项目的一个独特部分。只要Objective C类仅访问某些成员或调用C++对象上的函数,这种方法似乎运行良好。但是,我似乎找不到一种优雅的方法来使我的Objective C类响应C++类中的“事件”。任何使用回调的事件处理系统似乎都行不通(因为Objective C方法和C++函数可能无法互换)。我所能想到的就是使用委托模式,并编写包装器类以围绕我的C++委托类,以便在Objective C代码中使用它们。所以我的问题是:有更好的方法吗?
注: 我希望避免在我的C++文件中直接使用Objective C,因为这些类应该是平台无关的。
2个回答

4
您可能需要考虑CoreVideo使用的机制。
在他们的模型中,他们有一个机制涉及注册C回调函数(http://tinyurl.com/axtxajf),这个函数的参数之一是void *,可以转换为您需要访问的Objective-C类。
以下是您可以在C++模块中实现以注册回调函数的C函数示例。参数是回调函数和类实例的指针:
SetEventCallback(EventCallbackFunction, self);

当需要处理事件时,会调用回调函数,并且您可以将void*转换为Obj-C类并调用方法:
void EventCallbackFunction(void* objCPtr)
{
    [(MyObjCClass*)objCPtr someMethod];
}

注:在 ARC 下,必须使用桥接转换将 void * 转换为其他类型或将其他类型转换为 void * - Nate Chandler
在这种情况下,开销/包装将由许多C回调函数组成,它们仅将其参数传递给相应的Objective-C方法。使用匿名/lambda函数代替单独的C函数可能会很有趣。 - Double Dan

1

您可以使用C++0x lambda函数,它们可以与Objective-C块互换(可相互分配)。


谢谢提到lambda函数。我不知道它们的存在(还在学习C++和Objective C)。我认为最终的解决方案将是某种模板事件类,允许我定义像“anEvent<int,SomeObject*,bool>”这样的事件,并使用重载运算符来注册处理程序和调用事件。Lambda函数或Objective C块可能会节省我将Objective C方法调用包装在C函数或单独的类中的开销。由于我仍在学习,因此没有快速实现此解决方案的方法。我想我首先需要进行一些学习。 - Double Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接