objective-c - "Converting"指向 Objective-C 中 block 的函数指针

标签 objective-c block function-pointers objective-c-blocks

我正在做一些从 Mono C# 到 Obj-C 的互操作,遇到了这个问题。 C# 代码需要传递回调 - 它使用函数指针来传递回调。 我可以从 Obj-C 端获取函数指针并调用它,一切正常。 但是我现在需要将该函数指针作为回调提供给第三方 API,该 API 与 block 一起作为回调。 我希望第三方调用 C# 函数 - 所以在某种程度上我试图将函数指针转换为一个 block 以便第三方可以运行它,或者建立某种桥梁 - 创建我自己的运行 block 该函数指针并将其提供给第三方。我似乎无法找到一种方法来做到这一点——我如何生成一个包含要运行哪个函数的信息的 block ,然后将其提供给第三方。 也许我还有其他选择?

编辑:将函数放在全局变量中可能可行,但我希望能够拥有大量这样的变量,因为第三方 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。如果直接运行,我可以确认回调正常,并且正在调用该 block ,但它在函数(结果)行上失败。

最佳答案

为什么不只是有一个简单的功能

typedef void (*DummyAction)(char * result);
typedef void (^DummyBlock)(char * result);

DummyBlock functionToBlock(DummyAction func) {
    return [[^(char * result) {
                 func(result);
             } copy] autorelease];
}

关于objective-c - "Converting"指向 Objective-C 中 block 的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13913627/

相关文章:

assembly - 如何通过作为参数传递的函数指针调用函数?

objective-c - NSManagedObject 和 isDeleted

ios - 等待 block 完成返回 token nsstring

c - 理解 C 结构

c++ - std::function 与函数指针

vim - VIM中是否有 block 撤消功能?

objective-c - 我可以禁用 UIPickerView 滚动声音吗?

ios - 在 Core-Plot 中获取条形图高度

objective-c - Core Data 中的 'indexing' 到底是什么?

java - 如何检测文本 block