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
的单个实例
答案 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;
每当你停止玩家对象是一个轻量级物体时,它会释放玩家。