我使用iPhone SDK创建了一个示例应用程序,该SDK使用了AudioToolBox框架中的ExtAudioFileOpenURL。我的app的文档文件夹中有一个test.mp3音频文件。当我尝试使用此API打开此音频文件时,我收到了EXEC_BAD_ACCESS。我无法弄清楚原因。
以下是代码段:
NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *str = [arr objectAtIndex:0];
NSString * temp = [NSString stringWithFormat:@"%@/test.mp3", str];
CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)temp, kCFURLPOSIXPathStyle, false);
//AudioFileID fileID ;
//AudioFileOpenURL(url, 0X01, kAudioFileCAFType, &fileID);
ExtAudioFileRef audioFileRef = NULL;
ExtAudioFileOpenURL(url, &audioFileRef);
当我尝试ExtAudioFileOpenURL时,我得到了EXC_BAD_ACCESS。我以为是因为传递了无效的URL。但是,当我尝试使用AudioFileOpenURL时,它确实能够确保URL有效。
答案 0 :(得分:0)
我写这篇文章来解释EXC_BAD_ACCESS
http://www.loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html
基本上,您(可能)要么将消息发送到解除分配的对象,要么以某种方式破坏堆。当一个无害的呼叫引发EXC_BAD_ACCESS时,它几乎总是内存损坏。
你永远不会在这段代码中调用release或dealloc,因此这段代码不太可能导致消息被发送到解除分配的对象。
因此,可能是因为导致EXC_BAD_ACCESS发生在此代码之前。您可以通过在应用程序的早期移动此代码来证明这一点 - 它可能会起作用。如果没有,那么你确实需要真正检查这个代码,但如果它有效,那么它就是这些点之间的东西。
找到损坏的最有效方法可能是启用Malloc Debug,然后按照博客中的说明使用调试器查找导致损坏堆的行。