我需要在下一次分配之前释放吗?

Do I need to release before next alloc?

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

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

现在,在我第二次、第三次、第 n 次这样做之前,我是否需要 release 之前的分配?也许将其设置为零?我在这里要做的就是防止内存泄漏。

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

如果你不使用 ARC,你应该释放它并将其设置为 nil。

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

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

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

当然,这假设 属性 被声明为 strong,因为它应该是。