"Konvertieren" eines Funktionszeigers auf einen Block in Ziel-C
Ich mache ein paar Interops von Mono C # nach Obj-C und bin auf dieses Problem gestoßen. Der C # -Code muss einen Rückruf übergeben - was mit einem Funktionszeiger geschieht. Ich kann den Funktionszeiger von der Obj-C-Seite abrufen und es aufrufen und alles funktioniert. Aber jetzt muss ich diesen Funktionszeiger als Rückruf an eine Drittanbieter-API übergeben, die mit Blöcken als Rückruf arbeitet. Ich möchte, dass der Dritte die C # -Funktion aufruft - also versuche ich, entweder den Funktionszeiger in einen Block umzuwandeln, damit der Dritte ihn ausführen kann, oder eine Art Brücke zu erstellen - und einen eigenen Block zu erstellen, der ausgeführt wird diese Funktion Zeiger und geben Sie es an den Dritten. Ich finde anscheinend keine Möglichkeit dazu - wie würde ich einen Block mit Informationen darüber generieren, welche Funktion ausgeführt werden soll, und ihn dann an einen Dritten weitergeben. Vielleicht gibt es eine andere Option für mich?
Bearbeiten: Das Einfügen der Funktion in eine globale Variable könnte funktionieren, ich möchte jedoch eine Vielzahl von Funktionen haben, da die Drittanbieter-API asynchron ist und nicht den falschen Rückruf aufrufen soll.
Code, den ich versucht habe:
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
Und dann mache ich das mit
void RegisterCallback( char * text, DummyAction callback)
{
FunctionToBlock *funcToBlock = [[FunctionToBlock alloc] initWithFunction : callback];
funcToBlock.block(text);
}
Und es schlägt fehl mit BAD_ACCESS. Vielleicht mache ich etwas falsch, da ich mit Obj-C noch nicht sehr gut umgehen kann. Ich kann bestätigen, dass der Rückruf in Ordnung ist, wenn er direkt ausgeführt wird und der Block aufgerufen wird, aber in der Funktions- (Ergebnis-) Zeile fehlschlägt.