1

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

提前致谢

4

3 回答 3

5

有一个methodForSelector:方法返回一个IMP,一个指向给定选择器的方法实现的指针(相关问题)。这就是你所追求的吗?

作为更一般的评论,使用指向方法实现的指针通常太神奇了。您的用例是否有更高级别、更“普通”的解决方案?(我真的无法想象你在问题中写的细节。)

于 2013-03-13T16:30:26.187 回答
3

作为记录,您不能将信号连接到非静态 C++ 函数。至少不是信号的 *nix 含义。那些需要一个this调用指针。

现在,关于Objective C。取决于你想做什么——将指向Objective C方法的指针传递给纯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,例如是一个 Cocoa 类。考虑到这些天,对于 ObjC 问题来说,这是一个安全的选择。

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

于 2013-03-13T16:36:42.060 回答
2

Objective-C 方法实现 (IMP) 是一个 C 函数,它至少需要两个参数;方法调用的目标(self)和要调用的选择器(_cmd)。

因此,将 IMP 传递给您的 C API 是行不通的。

你最好的选择是传递一个 C 函数。假设您的 C API 是明智的并且具有“任意用户上下文指针”,例如:

void myfunc(void *context) {
    [(MyClass *)context callback];
} 
于 2013-03-13T16:34:32.930 回答