我需要在下一次分配之前发布吗?

时间:2015-02-16 22:13:26

标签: ios objective-c memory-management

我有一个内存管理问题。我在单例模式中使用AVAudioPlayer的单个实例来播放多个音频文件。我有多个具有播放按钮的视图,当用户进入视图并按下该按钮时,将调用AVAudioPlayer的全局实例,并使用新的mp3文件进行实例化:

NSURL *audioFileLocationURL = [[NSBundle mainBundle] URLForResource:audioFile withExtension:fileExtension];
NSError *error;
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileLocationURL error:&error];

现在,在我第二次,第三次和第n次这样做之前,我需要release之前的分配吗?也许把它设为零?我试图在这里做的就是防止内存泄漏。

在你提问之前:是的,我知道AVQueuePlayer,不,我不能在这种特殊情况下使用它。

2 个答案:

答案 0 :(得分:3)

由于您要分配属性(self.audioPlayer),因此您无需在显示的代码中发布。

理想情况下,所有内存管理都应该在属性的访问器中完成。 setter将释放旧值并保留(或者,对于具有copy属性的属性,复制)新值。 getter可能只返回没有内存管理的值,但是一个原子属性可能会在返回之前保留并自动释放该值。

当然,这假定该属性已被声明为strong,应该是这样。

答案 1 :(得分:0)

如果您不使用ARC,则应释放并将其设置为nil。

if (self.audioPlayer){
     [_audioPlayer release], _audioPlayer = nil;
}
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileLocationURL error:&error];