Я создал образец приложения с использованием iPhone SDK, который использует ExtAudioFileOpenURL из среды AudioToolBox. У меня есть аудиофайл 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);
Я получаю EXC_BAD_ACCESS, когда пробую ExtAudioFileOpenURL. Я думал, что это из-за переданного недействительного URL. Но когда я попробовал AudioFileOpenURL, он работал нормально, убедившись, что URL-адрес действителен.





Я написал это, чтобы объяснить EXC_BAD_ACCESS
http://www.loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html
По сути, вы (вероятно) либо отправляете сообщения освобожденным объектам, либо каким-то образом повреждаете кучу. Когда безобидный вызов вызывает EXC_BAD_ACCESS, это почти всегда повреждение памяти.
В этом коде вы никогда не вызываете release или dealloc, поэтому маловероятно, что этот код может вызвать отправку сообщений на освобожденные объекты.
Так что, вероятно, все, что вызывает EXC_BAD_ACCESS, произошло до этого кода. Вы можете доказать это, переместив этот код в самое начало вашего приложения - он, вероятно, сработает. Если нет, то вам действительно нужно проверить этот код, но если он работает, то это что-то среднее между этими пунктами.
Вероятно, самый эффективный способ найти повреждение - включить Malloc Debug и затем, следуя инструкциям в моем блоге, использовать отладчик для поиска строки, вызывающей повреждение кучи.