1

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

在播放声音后释放类成员AVAudioPlayer以播放另一个声音时出现问题。

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

我运行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代设备上不会发生。

我故意延迟释放,直到我需要播放另一个声音,以便给播放时间来执行。

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

[audio prepareToPlay];

我确实在viewDidLoad中将音频初始化为nil ,并在viewDidUnloaddealloc中进行清理。

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

4

1 回答 1

0

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

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

不完全确定我之前做错了什么,但系统在管理内存方面似乎比我好得多,我很高兴让它解决我所有的问题。

编辑 2

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

编辑

我可能有点为时过早。

虽然为此实施ARC总体上是有帮助的,但这个特定问题更深入。

显然,Core Foundation for iOS 6存在漏洞。

使用 ARC 从 NSURL 和 AVAudioPlayer 泄漏

内存泄漏 - NSString & NSURL

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

没有ARCGen 4/5 iOS 6工作正常,但Gen 3 iOS 5崩溃。

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

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

于 2013-01-30T19:59:00.783 回答