4

I've just started with releasing in core graphics, so I might need a little help.

I have code which looks like this:

UIImage *buttonImage() {

UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();


    CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();


    CGMutablePathRef outerPath;
    CGMutablePathRef midPath;
    CGMutablePathRef innerPath;
    CGMutablePathRef highlightPath;

//Some button stuff

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    CGContextRelease(context);

    return image;

}

That release line, I've put in. I'm getting an error with it though:

context_reclaim: invalid context
context_finalize: invalid context

Any thoughts as to where i should put the release in this instance?

Andrew
  • 15,935
  • 28
  • 121
  • 203

2 Answers2

6

You only need to do CGContextRelease(context) if you have previously done a CFRetain(context) or a CGContextRetain(context), or if you created the context yourself. In your example, you are calling UIGraphicsBeginImageContextWithOptions(), which is handling the creation of the context for you, thus, calling CGContextRelease() yourself is over-releasing it.

You do need to balance the CGColorSpaceCreateDeviceRGB() with either a:

CGColorSpaceRelease(baseSpace)

or a :

if (baseSpace) CFRelease(baseSpace)
iccir
  • 5,078
  • 2
  • 22
  • 34
6

You don't own the context when using UIGraphicsGetCurrentContext. Therefore you should not be releasing it. If you were to use CGContextRetain() then you would release. More information of this is available here:

Memory Management Guide for Core Foundation

I highly suggest reading the Memory Management programming guide to get an understanding of how it works.

skram
  • 5,314
  • 1
  • 22
  • 26