“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).