获取Objective-C方法的地址

时间:2013-03-13 16:25:58

标签: c++ objective-c class function-pointers

我是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函数。

提前致谢

3 个答案:

答案 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问题是一个安全的赌注。

或者你可以使用好的旧函数指针。他们还在附近。