"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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage