我正在做一些從Mono C#到Obj-C的Interop並遇到此問題。 C#代碼需要傳遞一個回調 - 它使用一個函數指針。 我可以從Obj-C端獲取函數指針並調用它,並且一切正常。 但我現在需要給該函數指針作爲第三方API的回調函數,它與塊一起作爲回調函數使用。 我希望第三方調用C#函數 - 所以通過某種方式,我試圖將函數指針轉換爲塊,以便第三方可以運行它,或者創建某種橋樑 - 創建我自己的塊運行該函數指針並將其提供給第三方。我似乎無法找到辦法做到這一點 - 我將如何生成一個信息塊運行哪個函數,然後將其提供給第三方。 也許對我來說還有另一種選擇?將函數指針「轉換」爲目標中的某個塊-I
編輯:把功能在一個全局變量可能的工作,但我希望能有這些作爲第三方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