Mono C# から Obj-C への相互運用を行っているところ、この問題に遭遇しました。C# コードはコールバックを渡す必要があります。これは、関数ポインターを使用して行います。Obj-C 側から関数ポインターを取得して呼び出すことができ、すべてが機能します。しかし、コールバックとしてブロックを操作するサードパーティ 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 に習熟していないので、何か間違ったことをしているのかもしれません。直接実行するとコールバックが正常であること、およびブロックが呼び出されていることを確認できますが、関数 (結果) 行で失敗します。