I'm having a memory leak when using this custom method which returns a CGImageRef. I can't release "cgImage" properly because I have to return it. What chould I do ?
- (CGImageRef)rectRoundedImageRef:(CGRect)rect radius:(int)radius
{
CGSize contextSize = CGSizeMake(rect.size.width, rect.size.height);
CGFloat imageScale = (CGFloat)1.0;
CGFloat width = contextSize.width;
CGFloat height = contextSize.height;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, width * imageScale, height * imageScale, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
// Draw ...
// Get your image
CGImageRef cgImage = CGBitmapContextCreateImage(context);
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
//CGImageRelease(cgImage); //If I release cgImage the app crashes.
return cgImage;
}
This is a general problem with Core Foundation objects because there is no autorelease pool in CF. As I see it, you have two options to solve the problem:
-newRectRoundedImageRef:radius:
to tell the caller that he takes ownership of the returned object and responsible for releasing it.CGImageRef
in an autoreleasedUIImage
object and return that ([UIImage imageWithCGImage:]
). That's probably what I would do.As suggested, we used:
but we still got an memory leak. our solution was to wrap code with an
block and that solve our problem.
cgImage
is owned by your method, you need to return it and give responsibility to the caller to release it throughCFRelease
.You can also return the
CGImage
wrapped inside aUIImage
instance, like this:You can autorelease a Core Foundation-compatible object. it just looks a bit wonky. :)
The GC-safe way is like so:
The shortcut, which is safe on iOS but no longer safe on the Mac, is this:
Either one will place the image in an autorelease pool and prevent a leak.