Перевести на объектив-C из объекта-C ++
-
09-10-2019 - |
Вопрос
У меня есть этот код в .mm
void MyMIDINotifyProc(const MIDINotification *message, void *refCon);
который идет с этой линией
MIDIClientCreate((CFStringRef)@"MidiMonitor MIDI Client", MyMIDINotifyProc, self, &client);
И тогда MyMidinotifyProc вызывается из Кориди.
Не изменяя расширение файла на .m, я переведен на подпись obj-c:
@interface MidiInput (Private)
-(void) MyMIDINotifyProc:(const MIDINotification *)message reference:(void *)refCon;
@end
какие компилирует, но тогда я понятия не имею, что делать с MIDIClientCreate
линия. Как есть, это производит "MyMIDINotifyProc" was not declared in this scope
. Отказ Это должно быть типа void *
... и документы на 100% ясно, что это A refCon passed back to notifyRefCon
(связь).
Это проблема разрешима в Obj-C в одиночку? Я представляю, что мне придется перевести материал C ++ в C, в этом случае я просто оставил его в покое.
Решение
MIDIClientCreate
ожидает обычной функции C в качестве обратного вызова. Вы не можете пройти его методом объекта-C, потому что конвенция о вызовах отличается (в C-терминах, первые два параметра к методу объекта-C self
а также _cmd
- селектор - который не будет там для обычной функции C).
Обычный путь вокруг этого состоит в том, чтобы создать функцию C, которая действует как прокладка и явно проходит как параметр. Функция Shim затем немедленно отправляет сообщение Objective-C. Я не знаком с этой библиотекой, но это выглядит refCon
это параметр, предназначенный для именно такого рода вещей. Так в вашем .m
Файл вам нужна функция такая.
static void MyMIDINotifyProc(const MIDINotification *message, void *refCon)
{
[(id) refCon MIDINotify: message];
}
Вам также нужен способ сделать фактический материал:
-(void) MIDINotify: (const MIDINotification*) message
{
// do stuff
}
И вы называете MidiclientCreate именно так, как вы делали изначально.