Traduci Objective-C da Objective-C ++
-
09-10-2019 - |
Domanda
Ho questo codice in un .mm
void MyMIDINotifyProc(const MIDINotification *message, void *refCon);
che va con questa linea
MIDIClientCreate((CFStringRef)@"MidiMonitor MIDI Client", MyMIDINotifyProc, self, &client);
e poi il MyMIDINotifyProc viene chiamato da CoreMIDI.
Senza cambiare l'estensione del file a .m, ho tradotto in una firma Obj-C:
@interface MidiInput (Private)
-(void) MyMIDINotifyProc:(const MIDINotification *)message reference:(void *)refCon;
@end
che compila, ma poi non ho idea di cosa fare con la linea MIDIClientCreate
. Come è, produce "MyMIDINotifyProc" was not declared in this scope
. Si suppone che sia di tipo void *
... E i documenti sono chiari al 100% che si tratta di A refCon passed back to notifyRefCon
( link ).
E 'questo problema risolvibile nel solo Obj-C? Immagino che avrei dovuto tradurre il roba C ++ a C, nel qual caso vorrei solo lasciarlo solo.
Soluzione
MIDIClientCreate
si aspetta una funzione C ordinario come la sua callback. Non è possibile passare è un metodo di Objective-C, perché la convenzione di chiamata è diversa (in termini di C, i primi due parametri a un metodo di Objective-C sono self
e _cmd
- il selettore - che non sarà lì per una funzione ordinaria C ).
Il solito modo per aggirare questo è di creare una funzione C che agisce come uno spessore ed esplicitamente passare sé come parametro. La funzione di spessore quindi invia immediatamente il messaggio Objective-C. Non ho familiarità con questa libreria, ma sembra refCon
è un parametro progettata esattamente per questo genere di cose. Quindi, nel file .m
hai bisogno di una funzione come questa.
static void MyMIDINotifyProc(const MIDINotification *message, void *refCon)
{
[(id) refCon MIDINotify: message];
}
È inoltre necessario un metodo per fare la roba reale:
-(void) MIDINotify: (const MIDINotification*) message
{
// do stuff
}
E si chiama MIDIClientCreate esattamente come facevi in ??origine.