【问题标题】:Wrapping a C Library with Objective-C - Function Pointers用 Objective-C 包装 C 库 - 函数指针
【发布时间】:2009-08-29 19:34:16
【问题描述】:

我正在用 Objective-C 编写一个 C 库的包装器。该库允许我在某些事件发生时注册回调函数。

register_callback_handler() 函数将函数指针作为参数之一。

我对编程大师的问题是:如何将 Objective-C 方法调用/选择器表示为函数指针?

  • 在这种情况下 NSInvocation 是否有用或级别太高?
  • 我最好只编写一个 C 函数,在其中写入方法调用,然后将指针传递给该函数吗?

任何帮助都会很棒,谢谢。

【问题讨论】:

    标签: c objective-c wrapper function-pointers


    【解决方案1】:

    register_callback_handler() 是否也采用 (void*) 上下文参数?大多数回调 API 都可以。

    如果是这样,那么您可以很容易地使用 NSInvocation。或者您可以分配一个包含对对象和选择器的引用的小结构,然后拼凑您自己的调用。

    如果它只需要一个函数指针,那么你可能会被淹没。即使对于纯 C 编码,您也需要在某个地方唯一标识上下文。

    鉴于你的回调处理程序确实有一个上下文指针,你已经准备好了:

    typedef struct {
        id target;
        SEL selector;
        // you could put more stuff here if you wanted
        id someContextualSensitiveThing;
    } TrampolineData;
    
    void trampoline(void *freedata) {
        TrampolineData *trampData = freedata;
        [trampData->target performSelector: trampData->selector withObject: trampData-> someContextualSensitiveThing];
    }
    
    ...
    TrampolineData *td = malloc(sizeof(TrampolineData));
    ... fill in the struct here ...
    register_callback_handler(..., trampoline, td);
    

    无论如何,这是一般的想法。如果您需要处理非对象类型的参数和/或回调,它会变得有点棘手,但不是那么多。最简单的方法是在将 objc_msgSend() 类型转换为正确类型的函数指针之后直接调用它,以便编译器生成正确的调用站点(请记住,您可能需要使用 objc_msgSend_stret() 来获取结构返回类型)。

    【讨论】:

    • 我不能透露太多关于库的信息,我不允许:(。参数是 (XFINST inst, unsigned int pid, void *func, void *freedata); 第一个是客户端实例,第二个是特定事件的数据包 ID,第三个是回调函数指针,最后一个是指向您可能希望传递给回调函数的某些数据的指针。
    • 好吧,你去……那么你是金子。
    • 你的意思是我可以使用 NSInvocation?
    • @Jasarien,请注意 void *func(在您的评论中给出)是 pointer to object-type,而不是 pointer to function-type。该标准对两种类型之间的转换/转换是否合法保持沉默,因此是隐含的未定义行为。对于“市场领导者”objc 目标而言,这可能不是问题,但如果您正在追求最大的便携性,请记住这一点。无论如何,将其移至适当的函数类型参数的良好做法。
    • 哦,作为对我上述评论的澄清点-pointer to object-type 是“对象类型”的 C 标准定义(即,您从 malloc() 获得的指针),而不是目标-C 对象。
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多