2011-10-25 134 views
0

我在下面几行代码:AVAudioPlayer返回nil随机

NSString *soundPath = [[NSBundle mainBundle] pathForResource:[[soundString componentsSeparatedByString:@"."]objectAtIndex:0] ofType:@"wav"]; 
NSURL *soundURL_ = [NSURL fileURLWithPath:soundPath]; 
av_player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL_ error:nil]; 

这些生产线的一类卡列斯AnimatableObject我用一个ViewController约10至30倍。

它在ViewControllers初始化和加载的前几次完全正常工作。但在切换ViewControllers一段时间后,我的应用程序崩溃,因为以下行(以前一直有效)现在返回nil。

av_player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL_ error:nil]; 

我检查了soundPath或soundURL_是否为零。但他们没事。完全相同的价值,就像它以前的所有时间一样。

所以,现在我问自己,它怎么会发生,它工作了很多次,并且返回零? 在同一个应用程序中,不关闭并重新启动它。我所做的只是在viewControllers之间切换。 我首先认为这是一个内存问题,但我没有得到任何内存警告。

我真的不知道为什么会发生这种情况。

任何帮助,将不胜感激。 Thx提前, 特立独行。

-------- --------编辑

我现在发现,我得到以下错误:

ImageIO: CGImageRead_mapData 'open' failed '/var/mobile/Applications/F3186E1A-BBC2-47A6-8EF6-90F73C9BD566/huckla_zoo.app/Weiter.png' 
error = 24 (Too many open files) 

,所以我意识到,我无法打开一个声音文件,当我得到这个错误。 我唯一想知道的事情是: 如何关闭文件句柄? 我不通过[UIImage imageNamed:]加载图像,但与

[UIImage imageWithContentsOfFile:filename]; 

我也已经实施了MutableDictionary作为图像缓存其中被清空,当出现内存问题。 有没有其他选项可以让我关闭文件句柄?

+1

来自initWithContentsOfURL的文档:error:method返回值:“如果nil,错误参数包含描述问题的代码”,而不是通过nil传递NSError对象并查看得到的错误,我会再次检查soundPath和soundURL_如果他们不为零 – alhcr

+0

好吧,我更新了这个问题,因为我现在知道是什么导致了崩溃。 thx到alhcr。 – Maverick1st

回答

2

尝试此,

的NSString * URL = [YOUR_URL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

+0

你真的很棒,我的应用名称中有空格,这解决了我的问题。 1三年后!此外,这个问题是针对iOS 7 ... – Khattab

0

从错误,它听起来像你已经打开了很多文件,并忘记关闭它们。你完成后是否发布文件对象?你使用了多少个文件?

+0

是的,我确实有很多文件打开。哪里是释放它们的最佳地点?在包含文件的AnimatableObject的dealloc中? 我有大约10到30每个ViewController类型AnimatableObject的对象。每个AnimatableObject可以包含在UIImage和一个或多个AVAudioPlayers上。AnimatableObjects是IBOutlets,所以我将它们设置为ViewController的viewDidUnload中的nil。我是否必须在dealloc方法中释放AnimatableObject中包含的所有变量? – Maverick1st