我正试图调试复杂iOS/Objective-C软件中的MIDI问题。它出现在这个电话上:
OSStatus s;
MIDIClientRef midi_client_ref;
s = MIDIClientCreate((CFStringRef)@"MIDIPlayerSetup MIDI Client", NULL, NULL,
&midi_client_ref);
大多数情况下,一切都很好,但有时返回的OSStatus是-50代码(坏参数)。
但是,正如您在网络上MIDIClientCreate的许多示例中看到的那样,显式参数并不是真正的问题。我甚至试图用一个唯一的名字,但没有效果。
为了确定我的搜索方向,我需要更准确地了解底层客户端创建中发生了什么,这可能会引发这个糟糕的参数问题。
欢迎任何猜测!
更新:有人在这里遇到了同样的问题并解决了它。他说"这是由一个未初始化的变量引起的。".
这是一个暗示,但不足以让我犯错误。。。
我联系了苹果,这是一个内部CoreMDI错误(至少在iOS8.3之前),直到现在都是未知的。
来自支持:
MIDIClientCreate本身将只在两种情况下返回-50:
1) 如果outClient本身为NULL,那么在上面的内容中,您忘记了获取客户端的地址。
2) 如果MIDI服务器在内部获取进程ID 时出现问题
我确保我提供的客户地址是可以的,所以在我的情况下是2)。
重现错误:
然后我注意到,在出现潜在错误之前,我曾多次调用MIDIGetNumberOfSources();
,因此我在其委托中实现了一个示例应用程序:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"application:didFinishLaunchingWithOptions:");
for (int i = 0; i < 100000000; i++) {
MIDIGetNumberOfSources();
}
MIDIClientRef client;
OSStatus s = MIDIClientCreate(CFSTR("iMIDI Client"), NULL, NULL, &client);
NSLog(@"OSStatus : %d", (int)s);
return YES;
}
在iOS 8.3(12F69)的iOS模拟器中在iPhone 5上运行该应用程序,每次在我的机器上重现错误的几率约为50%。