Sto facendo un po 'di interoperabilità da Mono C# a Obj-C e ho riscontrato questo problema. Il codice C# deve passare un callback - cosa che fa con un puntatore a funzione. Posso ottenere il puntatore di funzione dal lato Obj-C e chiamarlo e tutto funziona. Ma ora devo assegnare quel puntatore a funzione come callback all'API di terze parti che funziona con i blocchi come callback. Voglio che la terza parte chiami la funzione C# - quindi in un certo modo sto cercando di convertire il puntatore della funzione in un blocco in modo che la terza parte possa eseguirlo, o creare una specie di bridge - creare il mio blocco che esegue quel puntatore di funzione e lo consegna a terzi. Non riesco a trovare un modo per farlo - come potrei generare un blocco con informazioni su quale funzione eseguire e poi darla a terzi. Forse c'è un'altra opzione per me?"Conversione" di un puntatore di funzione su un blocco nell'obiettivo-C
Modifica: l'inserimento della funzione in una variabile globale potrebbe funzionare ma desidero essere in grado di avere una moltitudine di quelli in quanto l'API di terze parti è asincrona e non desidero che richiami la richiamata errata.
Codice ho provato:
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
E poi ho gestito questo con
void RegisterCallback(char * text, DummyAction callback)
{
FunctionToBlock *funcToBlock = [[FunctionToBlock alloc] initWithFunction : callback];
funcToBlock.block(text);
}
E non riesce con BAD_ACCESS. Forse sto facendo qualcosa di sbagliato in quanto non sono ancora molto abile con Obj-C. Posso confermare che il callback è ok se eseguito direttamente e che il blocco viene chiamato ma fallisce sulla riga della funzione (risultato).
Beh, hai ragione. Per qualche ragione non ci ho pensato. Funziona benissimo e molto pulito. Grazie! – Amitloaf