How to convert code to properly release memory
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];
- Where do I go from here?
- Nils are used in a similar开发者_如何学Go fashion throughout the code (and may cause similar problems) - is there a safe way to remove them?
- 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.
精彩评论