ExtAudioFileOpenUrl дает EXC_BAD_ACCESS

Я создал образец приложения с помощью 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-адрес действителен.


person Community    schedule 22.12.2008    source источник


Ответы (1)


Я написал это, чтобы объяснить EXC_BAD_ACCESS

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

По сути, вы (вероятно) либо отправляете сообщения освобожденным объектам, либо каким-то образом повреждаете кучу. Когда безобидный вызов вызывает EXC_BAD_ACCESS, это почти всегда повреждение памяти.

В этом коде вы никогда не вызываете release или dealloc, поэтому маловероятно, что этот код может вызвать отправку сообщений на освобожденные объекты.

Так что, вероятно, все, что вызывает EXC_BAD_ACCESS, произошло до этого кода. Вы можете доказать это, переместив этот код в самое начало вашего приложения - он, вероятно, сработает. Если нет, то вам действительно нужно проверить этот код, но если он работает, то это что-то среднее между этими пунктами.

Вероятно, наиболее эффективный способ найти повреждение - включить Malloc Debug и затем, следуя инструкциям в моем блоге, использовать отладчик для поиска строки, вызывающей повреждение кучи.

person Lou Franco    schedule 01.08.2010