我正在做一些从 Mono C# 到 Obj-C 的互操作,并遇到了这个问题。
C# 代码需要传递回调 - 它使用函数指针来执行此操作。
我可以从 Obj-C 端获取函数指针并调用它,一切正常。
但我现在需要将该函数指针作为回调提供给第三方 API,该 API 使用块作为回调。
我希望第三方调用 C# 函数 - 所以在某种程度上我试图将函数指针转换为一个块,以便第三方可以运行它,或者制作某种桥梁 - 创建我自己的运行块该函数指针并将其交给第三方。我似乎找不到一种方法来做到这一点 - 我如何生成一个包含要运行哪个函数的信息的块,然后将其提供给第三方。
也许我还有另一种选择?
编辑:将函数放入全局变量中可能可行,但我希望能够拥有多个函数,因为第三方 API 是异步的,我不希望它调用错误的回调。
我尝试过的代码:
typedef void (*DummyAction)(char * result);
typedef void (^DummyBlock)(char * result);
@interface FunctionToBlock : NSObject
{
DummyAction function;
DummyBlock block;
}
- (id) initWithFunction: (DummyAction) func;
- (DummyBlock) block;
@end
@implementation FunctionToBlock : NSObject
- (id) initWithFunction: (DummyAction) func {
if (self = [super init]) {
function = func;
block = ^(char * result) {
function(result);
};
}
return self;
}
- (DummyBlock) block {
return block;
}
@end
然后我运行这个
void RegisterCallback( char * text, DummyAction callback)
{
FunctionToBlock *funcToBlock = [[FunctionToBlock alloc] initWithFunction : callback];
funcToBlock.block(text);
}
并且它因 BAD_ACCESS 而失败。也许我做错了什么,因为我还不太精通 Obj-C。我可以确认如果直接运行回调是可以的,并且正在调用该块,但它在函数(结果)行上失败。
为什么不只是有一个简单的功能
typedef void (*DummyAction)(char * result);
typedef void (^DummyBlock)(char * result);
DummyBlock functionToBlock(DummyAction func) {
return [[^(char * result) {
func(result);
} copy] autorelease];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)