AVAudioPlayer 随机返回 nil
Posted
技术标签:
【中文标题】AVAudioPlayer 随机返回 nil【英文标题】:AVAudioPlayer returns nil at random 【发布时间】:2011-10-25 10:55:38 【问题描述】:我的代码中有以下几行:
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_ 是否为 nil。但他们没事。与以前的所有时间完全相同的值。
所以现在我问自己它是怎么发生的,它工作了很多次,然后返回 nil? 在同一个应用程序中,无需关闭并重新启动它。我所做的只是在视图控制器之间切换。 我一开始以为是内存问题,但我没有收到任何内存警告。
我真的不知道为什么会这样。
任何帮助将不胜感激。 提前谢谢, 特立独行。
--------编辑--------
我现在发现我收到以下错误:
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 作为图像缓存,当发生内存问题时,它会被清空。 我还有其他选择可以关闭我的文件句柄吗?
【问题讨论】:
来自 initWithContentsOfURL:error: 方法的文档返回值:“如果为 nil,则错误参数包含描述问题的代码。”,而不是传递 nil 传递 NSError 对象,看看你得到什么错误,如果它们不是 nil,我会再次检查 soundPath 和 soundURL_ 好的,我更新了问题,因为我现在知道导致崩溃的原因。感谢 alhcr。 【参考方案1】:试试这个,
NSString* URL = [YOUR_URL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
【讨论】:
你真的很棒,我的应用名称中有空格,这解决了我的问题。 1 三年后上涨!这个问题也适用于 ios 7 ...【参考方案2】:从错误中,听起来您打开了很多文件,却忘记关闭它们。完成后是否释放文件对象?您正在处理多少个文件?
【讨论】:
是的,我确实打开了很多文件。释放它们的最佳地点在哪里?在包含文件的 AnimatableObject 的 dealloc 中?每个 ViewController 有大约 10 到 30 个 AnimatableObject 类型的对象。每个 AnimatableObject 可以包含 UIImage 和一个或多个 AVAudioPlayers。 AnimatableObjects 是 IBOutlets,所以我在 ViewController 的 viewDidUnload 中将它们设置为 nil。是否必须在 dealloc 方法中释放 AnimatableObject 中包含的所有变量?以上是关于AVAudioPlayer 随机返回 nil的主要内容,如果未能解决你的问题,请参考以下文章
iOS6 AVAudioPlayer - AAC音频文件的持续时间总是返回0。
AVAudioPlayer initWithContentsOfURL 为 AAC/M4A 文件返回 nil