“Convertir” un puntero de función a un bloque en el objetivo-C

Estoy haciendo una interoperabilidad de Mono C # a Obj-C y me encontré con este problema. El código C # debe pasar una devolución de llamada, lo que hace con un puntero de función. Puedo obtener el puntero de función del lado Obj-C y llamarlo y todo funciona. Pero ahora tengo que dar el puntero a esa función como una devolución de llamada a una API de terceros que funciona con bloques como una devolución de llamada. Quiero que el tercero llame a la función C #, así que de alguna manera estoy intentando convertir el puntero de la función en un bloque para que el tercero pueda ejecutarlo, o hacer una especie de puente, crear mi propio bloque que se ejecute Esa función apunta y se la da al tercero. Parece que no puedo encontrar una manera de hacerlo: cómo generaría un bloque con información de qué función ejecutar y luego dársela a un tercero. Tal vez hay otra opción para mí?

Edición: poner la función en una variable global podría funcionar, pero quiero poder tener una multitud de ellas, ya que la API de terceros es asíncrona y no quiero que se llame la devolución de llamada incorrecta.

Código que probé:

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

Y luego corro esto con

void RegisterCallback( char * text, DummyAction callback)
{
    FunctionToBlock *funcToBlock = [[FunctionToBlock alloc] initWithFunction : callback];
    funcToBlock.block(text);
}

Y falla con BAD_ACCESS. Tal vez estoy haciendo algo mal ya que no soy muy competente con Obj-C todavía. Puedo confirmar que la devolución de llamada está bien si se ejecuta directamente y que se está llamando al bloque, pero falla en la línea de función (resultado).