我需要在下一次分配之前释放吗?
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
,因为它应该是。
我有一个内存管理问题。我在单例模式中使用 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
,因为它应该是。