0

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

4

2 回答 2

0

每次 ypu 按下播放按钮时都会创建播放器实例。但它没有被释放。使玩家成为一个属性。停止播放器后

self.player = nil;

每当您停止播放播放器对象是轻量级对象时,这将释放播放器。

于 2013-04-19T13:39:31.243 回答
0

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

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

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

于 2013-04-19T08:35:14.117 回答