如何转换代码以正确释放内存

时间:2010-04-19 10:17:58

标签: objective-c

我接管了一个有微妙缺陷的代码库 - 音频播放器静音,未记录的崩溃,奇怪的行为等。

我找到了一种方法来激发问题的一个实例,并将其跟踪到此代码段:

- (void)playNextArrayObject {

NSURL *soundURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]
  pathForResource:[[soundsToPlay objectAtIndex:count] description] 
  ofType:@"mp3"]];
self.audioPlayer = nil;

self.audioPlayer = [[AVAudioPlayer alloc] 
  initWithContentsOfURL:soundURL error:nil];

self.audioPlayer.delegate = self;
AudioSessionSetActive(YES);
[audioPlayer play];
}

当我注释掉第二行(nil)并在最后添加一个版本时,此问题就会停止。

[self.audioPlayer release];
  1. 我从哪里开始?
  2. Nils在整个代码中以类似的方式使用(可能会导致类似的问题) - 是否有一种安全的方法可以删除它们?
  3. 我是内存管理的新手 - 我怎样才能从糟糕的nil使用中辨别出正确的nil使用情况?

1 个答案:

答案 0 :(得分:1)

您的更改是正确的 - = nil行是noop,并且必须在alloc / init之后释放。使用self.something = nil可以是很好的做法;它释放属性的当前值,并确保您无法对释放的内存进行无效访问。

良好的内存管理很简单。但是你应该阅读Cocoa Memory Management Guide以获得明确的指示。