我是Objective-C的新手,我需要克服以下问题。 我正在尝试为C库开发前端,我需要以某种方式获取Objective-C成员函数的地址并将其传递给库。
例如:这就是我在C ++中所做的事情
class MyClass
{
public:
void my function();
void some_other_function()
{ connect_signal(my_function); }
};
在这里,我只是将my_function()
的地址传递给connect_signal。
Objective-C有可能吗?还有其他想法吗?
我的第二个选择是简单地从可以调用Objective-C函数的类中编写一个C函数。
提前致谢
答案 0 :(得分:4)
有一个methodForSelector:
方法返回IMP
,指向给定选择器(related question)的方法实现的指针。这就是你要追求的吗?
作为一个更一般的评论,使用指向方法实现的指针通常太神奇了。您的用例是否有更高级别,更“普通”的解决方案? (我无法想象你在问题中所写的内容的细节。)
答案 1 :(得分:2)
Objective-C方法实现(IMP)是一个C函数,它至少带有两个参数;方法调用的目标(self)和要调用的选择器(_cmd)。
因此,将IMP传递给您的C API将无效。
最好的办法是通过C函数。假设您的C API是合理的并且具有“任意用户上下文指针”,例如:
void myfunc(void *context) {
[(MyClass *)context callback];
}
答案 2 :(得分:2)
对于记录,您无法将信号连接到非静态C ++函数。至少不是信号的* nix含义。那些需要一个this
指针来进行调用。
现在,关于Objective C.取决于你想做什么 - 将指向Objective C方法的指针传递给plain-C API,或者实现你自己的类似信号的回调机制。其他答案集中于前者;让我们谈谈后者。
自然要做的是传递选择器和对象指针的组合。选择器具有数据类型SEL
,并使用@selector()构造进行检索。选择器是一段数据(实际上是一个整数),它唯一地标识类层次结构中的方法。
让我们假设您在某个地方有connect_signal
函数需要回调:
-(void)connect_signal:(SEL)callbackSelector forObject:(NSObject*)callbackObject;
你这样称呼它(来自回调对象):
[xx connect_signal:@selector(MyMethod:) forObject:self];
在函数中,保存选择器和对象指针。当您需要调用回调时,您将发出以下调用:
[SavedCallbackObject performSelector:(SavedCallbackSelector) withObject: nil];
第二个参数用于将参数传递给回调;如果您需要多个,请参阅NSInvoke。
我的回答是假设可可。 NSObject,e。 G。是一个Cocoa类。考虑到这几天ObjC问题是一个安全的赌注。
或者你可以使用好的旧函数指针。他们还在附近。