';铸造';对Objective-C块的C回调
我一直在阅读Objective-C块(例如,在and或or堆栈溢出答案中)。我想把一个C/C++风格的回调传递到Objtovi-C方法。 这是我在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
#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); }];
}
可能重复可能重复