启用了弧的AVAudioPlayer中的内存泄漏

时间:2013-04-19 08:22:39

标签: ios memory-leaks automatic-ref-counting avaudioplayer instruments

ARC 已启用。仪器显示内存泄漏。 任何解决方案?

这是我的代码:

- (void) onPlayButtonClicked
{
    NSString *title = @"Pause";

if (isPlay) {
    [player stop];
    player.delegate = nil;
    title = @"Play";
}
else
{
    player = [[ReaderGlobals audioPlayer] initWithContentsOfURL:mSoundPath error:nil];
    player.delegate = self;
    [player play];
}

isPlay ^= true;
[mButtonPlay setTitle:title forState:UIControlStateNormal];
}

ReaderGlobals是一个单例类,[ReaderGlobals audioPlayer]返回AVAudioPlayer的单个实例

2 个答案:

答案 0 :(得分:0)

如果你的单身[ReaderGlobals audioPlayer]正在返回一个实例,那么你就不需要在其上调用initWithContentsOfURL:error:。也就是说,您告诉我们AVAudioPlayer已经被分配(retainCount增加到1)和“inited”。因此,您应该只设置需要在现有返回的实例上设置的内容。不要再次调用init。

作为一般的最佳实践,您不应该多次在对象上调用init。虽然它不会增加retainCount(alloc确实),但它可能会重新创建/重置内部ivars,这可能导致现有值泄露。

作为一般规则,您应该使用setter将任何值重置为新值(在您的情况下为URL)。但是,AVAudioPlayer没有网址设置器,因此,只要您希望应用其他网址,就必须完全创建新的AVAudioPlayer实例。这就是它的用途。

答案 1 :(得分:0)

每次ypu按下播放按钮时都会创建播放器实例。但它没有发布。让玩家成为财产。停止玩家后

self.player = nil;

每当你停止玩家对象是一个轻量级物体时,它会释放玩家。