在iOS4 / iOS5中释放AVAudioPlayer会导致EXC_BAD_ACCESS错误

时间:2013-01-27 04:18:46

标签: ios avaudioplayer

编辑:将我的设备(和部署目标)从iOS 4.3.5更新到iOS 5.1.1并仍然存在同样的问题

在播放声音后释放类成员 AVAudioPlayer 以播放其他声音时出现问题。

这似乎只是我的某个设备上的问题,第3代 iPod Touch 运行 iOS 4.3.5 / 5.1.1

运行 iOS 6 第4 第5 代设备运行正常。

[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_ACCESS 错误,这不会发生在第4 /第5 < / strong>生成设备。

我故意延迟发布,直到我需要播放另一种声音才能让播放时间来执行。

尝试使用 AVAudioPlayerDelegate ,但这并没有解决问题,也没有调用:

[audio prepareToPlay];

我在 viewDidLoad 中将音频初始化为 nil ,并在 viewDidUnload dealloc中清理

有很多内存泄漏问题但是这个版本的代码似乎解决了这个问题。

1 个答案:

答案 0 :(得分:0)

感谢上面的评论,以及我所有其他想法的失败,我继续利用 ARC

我不想重构我的整个项目以开始使用 ARC ,所以我重新编写了一个新类来处理我的所有音频需求并设置一些编译器标志( -fobjc- arc )仅为该文件启用 ARC

之前并不完全确定我做错了什么,但系统似乎比我更好地管理内存,我很乐意让它解决我所有的问题。

编辑2

显然Apple终于解决了他们的内存泄漏问题,所以我回到了我的 ARC 解决方案,该解决方案适用于 iOS 5 iOS 6

修改

我可能有点过早。

虽然实施 ARC 通常很有帮助,但这个具体问题会更深入。

显然, iOS 6 Core Foundation 有泄漏。

Leak from NSURL and AVAudioPlayer using ARC

Memory Leak - NSString & NSURL

使用 ARC ,它在我的 Gen 3 iOS 5 设备上运行良好,但 Gen 4/5 iOS 6 显着泄漏。< / p>

如果没有 ARC Gen 4/5 iOS 6 工作正常,但第3代iOS 5 崩溃。

我最终制作了两个版本的新类,一个使用 ARC 而另一个没有,并在运行时 [[UIDevice currentDevice] systemVersion] 检查系统版本确定使用哪个版本。

它可能有点笨拙,但允许我支持 Gen 3 设备。如果 Apple 修复了他们的问题,我可以在那时返回单个版本。