在iOS4/iOS5中释放AVAudioPlayer,给出EXC\u BAD\u访问错误
编辑:已将我的设备和部署目标从iOS 4.3.5更新为iOS 5.1.1,但仍然存在相同的问题 在播放声音后释放类成员AVAudioPlayer以播放另一个声音时出现问题 这似乎只是我的一款设备上的问题,它是运行iOS 4.3.5/5.1.1的第三代iPod Touch 我运行iOS 6的第四代和第五代设备运行良好在iOS4/iOS5中释放AVAudioPlayer,给出EXC\u BAD\u访问错误,ios,avaudioplayer,Ios,Avaudioplayer,编辑:已将我的设备和部署目标从iOS 4.3.5更新为iOS 5.1.1,但仍然存在相同的问题 在播放声音后释放类成员AVAudioPlayer以播放另一个声音时出现问题 这似乎只是我的一款设备上的问题,它是运行iOS 4.3.5/5.1.1的第三代iPod Touch 我运行iOS 6的第四代和第五代设备运行良好 [audio release]; audio = nil; @try { audio = [[AVAudioPlayer alloc] initWithContentsOfU
[audio release];
audio = nil;
@try
{
audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if ((audio != nil) && (!error))
{
audio.delegate = (id)self;
audio.volume = gVolume/10;
[audio play];
}
else
{
[audio release];
audio = nil;
}
}
@catch (NSException *exception)
{
[audio release];
audio = nil;
}
第一次播放很好,但是当这个代码执行第二次播放另一个声音时,会出现EXC_BAD_访问错误,这在我的第四代/第五代设备上不会发生
我故意延迟释放,直到我需要播放另一个声音,以便给播放时间来执行
尝试使用AVAudioPlayerDelegate,但这并没有解决问题,调用:
[audio prepareToPlay];
我在viewDidLoad中将音频初始化为零,并在viewDidUnload和dealloc中进行清理
有很多内存泄漏问题,但是这个版本的代码似乎已经解决了这个问题。多亏了上面的评论,以及我所有其他想法的失败,我继续并利用了ARC 我不想重构我的整个项目来开始使用ARC,所以我重写了一个新类来处理我所有的音频需求,并设置了一些编译器标志-fobjc-ARC,以便仅为该文件启用ARC 我不太清楚我以前做错了什么,但这个系统似乎比我更善于管理内存,我很高兴让它解决了我所有的问题 编辑2: 显然,苹果最终解决了内存泄漏问题,所以我回到了我的ARC解决方案,该解决方案在iOS 5和iOS 6上都运行良好 编辑: 我可能有点过早 虽然为此实现ARC在总体上是有帮助的,但这个特定的问题更深入 显然,IOS 6的核心基础存在漏洞。 使用ARC,它在我的第3代iOS 5设备上运行良好,但在第4代/5代iOS 6设备上泄漏严重 如果没有ARC,Gen 4/5 iOS 6可以正常工作,但Gen 3 iOS 5崩溃 最后,我为我的新类制作了两个版本,一个使用ARC,另一个不使用,并在运行时检查系统版本[[UIDevice currentDevice]systemVersion],以确定使用哪个版本
这可能有点笨拙,但确实允许我支持Gen 3设备。如果苹果解决了他们的问题,我可以在那个时候回到单一版本。为什么不打开ARC,让你的生活更轻松?如果你不能打开ARC,你能在Xcode仪器中运行吗?主要是因为我的无知。不确定如何将ARC整合到现有的应用程序中,但它肯定在需要研究的短列表中。谢谢