Mono C#からObj-CにいくつかのInteropを実行していて、この問題が発生しました。 C#コードは関数ポインタを使用してコールバックを渡す必要があります。 私はObj-C側から関数ポインタを取得して呼び出すことができ、すべてが機能します。 しかし、私は今ブロックをコールバックとして扱う第三者APIへのコールバックとして、その関数ポインタを与える必要があります。 サードパーティがC#関数を呼び出そうとしています。つまり、関数ポインタをブロックに変換して、サードパーティがそれを実行できるようにしたり、何らかのブリッジを作成したりする方法で、自分のブロックを作成します。その関数ポインタを実行し、それを第三者に渡します。私はそれを行う方法を見つけることができないように見える - 私は実行する関数の情報を持つブロックを生成し、それを第三者に与える方法を教えてください。 私には別の選択肢がありますか?Object-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にあまり堪能ではないので、何か間違っているのかもしれません。コールバックが直接実行され、ブロックが呼び出されていても関数(結果)行で失敗した場合は、コールバックが正常であることを確認できます。
さて、あなたは正しいです。何らかの理由で、私はそれを考えなかった。素晴らしい作品と非常にきれいな作品。ありがとうございました! – Amitloaf