Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS4/iOS5中释放AVAudioPlayer,给出EXC\u BAD\u访问错误_Ios_Avaudioplayer - Fatal编程技术网

在iOS4/iOS5中释放AVAudioPlayer,给出EXC\u BAD\u访问错误

在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

编辑:已将我的设备和部署目标从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] 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整合到现有的应用程序中,但它肯定在需要研究的短列表中。谢谢