0

我使用 iPhone SDK 创建了一个示例应用程序,它使用 AudioToolBox 框架中的 ExtAudioFileOpenURL。我的应用程序文件夹中有一个 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 是有效的。

4

1 回答 1

0

我写这个是为了解释 EXC_BAD_ACCESS

http://www.loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html

基本上,您(可能)要么向解除分配的对象发送消息,要么以某种方式破坏堆。当一个无害的调用引发 EXC_BAD_ACCESS 时,它几乎总是内存损坏。

您永远不会在此代码中调用 release 或 dealloc,因此此代码不太可能导致将消息发送到已释放的对象。

因此,可能导致 EXC_BAD_ACCESS 的任何原因都发生在此代码之前。您可以通过将此代码移到应用程序的早期阶段来证明这一点——它可能会起作用。如果不是,那么您确实需要真正检查此代码,但如果它有效,那么它介于这些点之间。

找到损坏的最有效方法可能是启用 Malloc 调试,然后按照我的博客中的说明使用调试器查找导致损坏堆的行。

于 2010-08-01T17:44:28.000 回答