开发者

How to convert code to properly release memory

开发者 https://www.devze.com 2022-12-27 03:42 出处:网络
I\'ve taken over a code base that has subtle flaws - audio player goes mute, unlogged crashes, odd behavior, etc.

I've taken over a code base that has subtle flaws - audio player goes mute, unlogged crashes, odd behavior, etc.

I found a way to provoke one instance of the problem and tracked it to this code snippet:

- (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];
}

When I comment out the 2nd line (nil) and add a release to the end, this problem stops.

[self.audioPlayer release];
  1. Where do I go from here?
  2. Nils are used in a similar开发者_如何学Go fashion throughout the code (and may cause similar problems) - is there a safe way to remove them?
  3. I'm new to memory management - how can I discern proper nil usage from bad nil usage?


Your change is correct - the =nil line is a noop, and the release is necessary following the alloc/init. Using self.something = nil can be good practice; it releases the current value of a property, and makes sure that you can't make invalid access to the freed memory.

Good memory management is simple. But you should read the Cocoa Memory Management Guide for explicit instructions.

0

精彩评论

暂无评论...
验证码 换一张
取 消