转化为Objective-C ++的Objective-C
-
09-10-2019 - |
题
我在.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
(关联).
这个问题仅在OBJ-C中可以解决吗?我想我必须将C ++的内容转换为C,在这种情况下,我只会不理会它。
解决方案
MIDIClientCreate
期望普通的C函数作为回调。您不能将其传递给Objective-C方法,因为调用约定是不同的(用C术语,Objective-C方法的前两个参数为 self
和 _cmd
- 选择器 - 对于普通的C函数,它不会在那里)。
围绕此的通常方法是创建一个C函数,该C函数充当垫片,并明确地将自我作为参数传递。然后,垫片功能立即发送Objective-C消息。我不熟悉这个图书馆,但看起来像 refCon
是专门针对这种事情而设计的参数。所以在你里面 .m
文件您需要这样的函数。
static void MyMIDINotifyProc(const MIDINotification *message, void *refCon)
{
[(id) refCon MIDINotify: message];
}
您还需要一种方法来完成实际工作:
-(void) MIDINotify: (const MIDINotification*) message
{
// do stuff
}
然后,您像最初的时光一样称呼MidicLientCreate。