';铸造';对Objective-C块的C回调

';铸造';对Objective-C块的C回调,objective-c,Objective C,我一直在阅读Objective-C块(例如,在and或or堆栈溢出答案中)。我想把一个C/C++风格的回调传递到Objtovi-C方法。 这是我在C/C++方面的声明 #ifdef __cplusplus extern "C" { #endif typedef void (*CALCULATION_CALLBACK)(int x); void setCubeCallback(int x, CALCULATION_CALLBACK callback); #ifdef __cpl

我一直在阅读Objective-C块(例如,在and或or堆栈溢出答案中)。我想把一个C/C++风格的回调传递到Objtovi-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
void setCubeCallback(int x, CALCULATION_CALLBACK callback) {
    [[[IOSPluginTest alloc] init] cubeThisNumber:x andCallbackOn:callback];
}
在最后一点出错了,C/C++实现< /P>
#import "IOSPluginTest.h"

@implementation IOSPluginTest

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

@end
void setCubeCallback(int x, CALCULATION_CALLBACK callback) {
    [[[IOSPluginTest alloc] init] cubeThisNumber:x andCallbackOn:callback];
}
编译失败,出现错误

正在向不兼容类型“CalculationHandler”(又名“void(^)(int)”的参数发送“CALCULATION_回调”(又名“void(*)(int)”)

这两种类型的描述,
void(*)(int)
void(^)(int)
,看起来很像我;我缺少什么?

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

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

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

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

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

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

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

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

在Objective-C中可以很好地使用函数指针。如果希望两个接口直接兼容,只需使用
CALCULATION\u CALLBACK
作为Objective-C方法中
CALLBACK
参数的类型

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

void setCubeCallback(int x, CALCULATION_CALLBACK callback) {
    [[[IOSPluginTest alloc] init] cubeThisNumber:x andCallbackOn:^(int result){ callback(result); }];
}
嗯,“[类型]看起来很相似”在编程中并不重要

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

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

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

在Objective-C中可以很好地使用函数指针。如果希望两个接口直接兼容,只需使用
CALCULATION\u CALLBACK
作为Objective-C方法中
CALLBACK
参数的类型

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

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