【发布时间】: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。
标签: objective-c iphone xcode ipad avaudioplayer