【问题标题】:Getting the address of an Objective-C method获取 Objective-C 方法的地址
【发布时间】:2013-03-13 16:25:58
【问题描述】:

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

提前致谢

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 那么,如果我一切都做对了,我应该首先通过获取选择器来获取当前函数的 IMP,然后将该 IMP 转换为 C 函数指针?
    • IMP 已经是一个 C 函数指针:typedef id (*IMP)(id self, SEL _cmd, ...)。第一个参数是对象,第二个参数是被调用的选择器。根据您的 C 代码,此签名可能有问题,也可能没有问题。
    【解决方案2】:

    郑重声明,您不能将信号连接到非静态 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。

    我的答案是假设 Cocoa。 NSObject,例如。 G。是一个可可类。考虑到这些天,对于 ObjC 问题来说这是一个安全的选择。

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

    【讨论】:

      【解决方案3】:

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

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

      最好的办法是传递一个 C 函数。假设您的 C API 是合理的并且具有“任意用户上下文指针”,例如:

      void myfunc(void *context) {
          [(MyClass *)context callback];
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-07
        • 2012-10-15
        • 2020-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        • 2021-05-16
        相关资源
        最近更新 更多