BeachRunnerFred
BeachRunnerFred

Reputation: 18578

Trying to understand memory management on the iOS platform

Here's a block of code that has leaks...

NSString *filename = [NSString stringWithFormat:@"%@.png", sketchID];
CGImageRef imageRef = CGBitmapContextCreateImage(paintView.canvas.mBitmapContext);
UIImage* image = [[UIImage alloc] initWithCGImage:imageRef];
NSData* imageData = UIImagePNGRepresentation(image); 
  1. Where are they?
  2. In general, how can I tell so I don't create leaks in the future?
  3. What's the proper way to fix them?

Thanks so much!

Upvotes: 1

Views: 426

Answers (2)

Moshe
Moshe

Reputation: 58097

The general rule is that when you call alloc then you need a corresponding release. The exception is when you call autorelease. Also, when you use convenience methods, such as 'stringWithFormat'.

Upvotes: 0

Pablo Santa Cruz
Pablo Santa Cruz

Reputation: 181420

AS far as I can tell you have memleaks in:

CGImageRef imageRef = CGBitmapContextCreateImage(paintView.canvas.mBitmapContext);

You need to call CGContextRelease. Check this SO question out.

You need to release image aswell. After creating imageData, do:

[image release];

You don't have to release fileName since you are not explicitly allocating memory for it. It will autorelease when variable falls out of scope. There are naming conventions in objective-c that will tell you when you will have to release and when you don't. Check out Apple documentation for it.

Hope it helps.

Upvotes: 4

Related Questions