我有一个内存管理问题。我在单例模式中使用AVAudioPlayer
的单个实例来播放多个音频文件。我有多个具有播放按钮的视图,当用户进入视图并按下该按钮时,将调用AVAudioPlayer
的全局实例,并使用新的mp3文件进行实例化:
NSURL *audioFileLocationURL = [[NSBundle mainBundle] URLForResource:audioFile withExtension:fileExtension];
NSError *error;
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileLocationURL error:&error];
现在,在我第二次,第三次和第n次这样做之前,我需要release
之前的分配吗?也许把它设为零?我试图在这里做的就是防止内存泄漏。
在你提问之前:是的,我知道AVQueuePlayer
,不,我不能在这种特殊情况下使用它。
答案 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];