2008-12-22 6 views
0

J'ai créé un exemple d'application en utilisant le SDK iPhone qui utilise ExtAudioFileOpenURL du framework AudioToolBox. J'ai un fichier audio test.mp3 dans le dossier de documents de mon application. Quand j'ai essayé d'ouvrir ce fichier audio en utilisant cette API, j'ai reçu EXEC_BAD_ACCESS. Je ne pouvais pas comprendre pourquoi.ExtAudioFileOpenUrl donnant EXC_BAD_ACCESS

Voici un extrait de code:

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); 

Je reçois EXC_BAD_ACCESS lorsque je tente le ExtAudioFileOpenURL. Je pensais que c'était à cause de l'URL invalide passée. Mais quand j'ai essayé AudioFileOpenURL cela a bien fonctionné en m'assurant que l'URL est valide.

Répondre

0

j'ai écrit ceci pour expliquer EXC_BAD_ACCESS

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

Fondamentalement, vous êtes (probablement) soit d'envoyer des messages à des objets dealloced ou corrompre le tas d'une certaine façon. Lorsqu'un appel inoffensif déclenche EXC_BAD_ACCESS, il s'agit presque toujours d'une corruption de mémoire.

Vous n'appelez jamais release ou dealloc dans ce code, il est donc peu probable que ce code puisse provoquer l'envoi de messages à des objets libérés. Donc, probablement, tout ce qui provoque EXC_BAD_ACCESS est arrivé avant ce code. Vous pouvez le prouver en déplaçant ce code très tôt dans votre application - cela fonctionnera probablement. Si ce n'est pas le cas, vous devez vraiment vérifier ce code, mais si cela fonctionne, alors c'est quelque chose entre ces points.

Probablement le moyen le plus efficace de trouver la corruption est en activant Malloc Debug et en suivant les instructions dans mon blog pour utiliser le débogueur pour trouver la ligne qui provoque le tas corrompu.