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

AvAudioPlayer 不工作?

是否要在后台队列中调用 AVAudioPlayer 的 -prepareToPlay?

多视图应用程序中的 AVAudioPlayer 问题

AVAudioRecorder / AVAudioPlayer - 将录音附加到文件