views:

92

answers:

2

Hello. 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!

+3  A: 

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.

Pablo Santa Cruz
thanks, pablo. question, why don't i ahve to release imageData? or filename?
BeachRunnerJoe
Updated the answer with a little commend on filename. You should release imageData after you are done with it.
Pablo Santa Cruz
Thanks again, Pablo. Are you sure I need to release imageData? I figured I would haven't release imageData for the same reason I don't have to release fileName. Your thoughts?
BeachRunnerJoe
True. According to doc (http://developer.apple.com/iphone/library/documentation/uikit/reference/UIKitFunctionReference/Reference/reference.html#//apple_ref/c/func/UIImagePNGRepresentation) the memory will be autoreleased.
Pablo Santa Cruz
-1 You don't have to release the context; you have to release the image.
tc.
A: 

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'.

Moshe
Um, you should release. *Never* explicitly deallocate an object unless you really know what you're doing.
tc.
My mistake. I meant release.
Moshe