Перевести на Objective-C с Objective-C ++ - PullRequest
0 голосов
/ 12 декабря 2010

У меня есть этот код в .mm

void MyMIDINotifyProc(const MIDINotification *message, void *refCon);

, который идет с этой строкой

MIDIClientCreate((CFStringRef)@"MidiMonitor MIDI Client", MyMIDINotifyProc, self, &client);

, а затем MyMIDINotifyProcвызывается из CoreMIDI.

Не меняя расширение файла на .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 ( link ).

Эта проблема разрешима только в Obj-C?Я полагаю, что мне пришлось бы перевести материал C ++ в C, и в этом случае я бы просто оставил это в покое.

1 Ответ

3 голосов
/ 12 декабря 2010

MIDIClientCreate ожидает обычную функцию C в качестве обратного вызова. Вы не можете передать ему метод Objective-C, потому что соглашение о вызовах отличается (в терминах C первые два параметра метода Objective-C - self и _cmd - селектор - которого не будет обычная функция C).

Обычный способ обойти это - создать функцию C, которая действует как прокладка и явно передает self в качестве параметра. Затем функция подкладки немедленно отправляет сообщение target-C. Я не знаком с этой библиотекой, но похоже, что refCon - это параметр, предназначенный именно для такого рода вещей. Так что в вашем .m файле вам нужна такая функция.

static void MyMIDINotifyProc(const MIDINotification *message, void *refCon)
{
    [(id) refCon MIDINotify: message];
}

Вам также нужен метод, чтобы сделать фактические вещи:

-(void) MIDINotify: (const MIDINotification*) message
{
    // do stuff
}

И вы вызываете MIDIClientCreate в точности так, как вы делали изначально.

...