【问题标题】:'Casting' C callbacks to Objective-C blocks将 C 回调“铸造”到 Objective-C 块
【发布时间】:2017-02-14 11:30:57
【问题描述】:

我一直在阅读有关 Objective-C 块的内容(例如,在 Apple documentationa blog postonetwothree Stack Overflow 答案中)。我想将 C/C++ 风格的回调传递给 Objective-C 方法。

这是我在 C/C++ 方面的声明

#ifdef __cplusplus
extern "C" {
#endif

    typedef void (*CALCULATION_CALLBACK)(int x);
    void setCubeCallback(int x, CALCULATION_CALLBACK callback);

#ifdef __cplusplus
}
#endif

在 Objective-C 中

@interface IOSPluginTest : NSObject

typedef void (^CalculationHandler)(int x);
-(void)cubeThisNumber:(int)number andCallbackOn:(CalculationHandler)callback;

@end

这就是 Objective-C 的实现

#import "IOSPluginTest.h"

@implementation IOSPluginTest

-(void)cubeThisNumber:(int)number andCallbackOn:(CalculationHandler)callback {
    int result = number * number * number;
    if (callback != nil) {
        callback(result);
    }
}

@end

最后一点出错了,C/C++ 实现

void setCubeCallback(int x, CALCULATION_CALLBACK callback) {
    [[[IOSPluginTest alloc] init] cubeThisNumber:x andCallbackOn:callback];
}

编译失败,报错

将“CALCULATION_CALLBACK”(又名“void(*)(int)”)发送到不兼容类型“CalculationHandler”(又名“void(^)(int)”)的参数

void(*)(int)void(^)(int) 这两种类型的描述和我很相似;我错过了什么?

【问题讨论】:

标签: objective-c


【解决方案1】:

嗯,“[类型] 看起来很相似”在编程中并不重要。

你缺少的是块和函数指针是不同类型的东西。

函数指针几乎就是函数代码第一条指令的地址。

块是一个对象。该对象持有的数据中有一个函数指针,但它也有其他数据。除了作为对象的基本基础结构(例如isa 指针)之外,块还可以从其定义站点捕获变量值。

你可以在 Objective-C 中使用函数指针就好了。如果你想让你的两个接口直接兼容,只需在Objective-C方法中使用CALCULATION_CALLBACK作为callback参数的类型即可。

或者,您可以将函数指针包装在一个块中,如下所示:

void setCubeCallback(int x, CALCULATION_CALLBACK callback) {
    [[[IOSPluginTest alloc] init] cubeThisNumber:x andCallbackOn:^(int result){ callback(result); }];
}

【讨论】:

    【解决方案2】:

    void(*)(int)是一个方法指针void(^)(int)是一个块,在其他语言中称为闭包。它们是根本不同的。虽然方法指针只是这样做——指向一个方法——但块也通过封装来携带数据。这件事非常不同,试图将它们从一个到另一个是没有意义的。

    但是您可以在 Objective-C 中使用 C 方法指针。

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      相关资源
      最近更新 更多