【问题标题】:Release AVAudioPlayer in iOS4/iOS5 giving EXC_BAD_ACCESS error在 iOS4/iOS5 中发布 AVAudioPlayer 给出 EXC_BAD_ACCESS 错误
【发布时间】:2013-01-10 17:59:01
【问题描述】:

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

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

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

我的运行 iOS 64th5th 代设备运行良好。

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

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

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

[audio prepareToPlay];

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

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

【问题讨论】:

  • 为什么不打开 ARC 让您的生活更轻松?如果你不能打开 ARC,你可以在 Xcode Instruments 中运行它吗?
  • 主要是因为我的无知。不完全确定如何将 ARC 合并到现有应用程序中,但它绝对是要研究的短名单。谢谢。

标签: ios avaudioplayer


【解决方案1】:

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

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

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

编辑 2

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

编辑

我可能有点早了。

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

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

Leak from NSURL and AVAudioPlayer using ARC

Memory Leak - 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 解决了他们的问题,我可以在那个时候返回单个版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多