CoreGraphics对象自动释放次数太多

时间:2015-01-20 19:11:40

标签: ios xcode core-graphics autorelease

在分析我的应用程序时,Xcode向我发出警报,显示他们是存储在'colorSpace'中的对象的潜在泄漏(下面代码的最后一行):

CGContextSaveGState(context);
CGContextAddRect(context, rect);
CGContextClip(context);
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGContextRestoreGState(context);

所以,我添加了以下一行:

CFAutorelease(context);

再次分析。这次,我在“对象自动释放次数太多次(在'CGPointMake'调用中)下面的第二行收到警报:

case SWShadowDirectionUp:
     startPoint = CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect) - 0.5);
     endPoint = CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect) - 0.5);
                break;

以下是使用colorSpace变量的地方:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat locations[] = { 0.0, 1.0 };
NSArray *colors = @[ (__bridge id)self.startColor.CGColor, (__bridge id)self.endColor.CGColor ];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations);
CFAutorelease(colorSpace);

但是,我不确定到底出了什么问题,或者如何修复它。有没有人有什么建议?

1 个答案:

答案 0 :(得分:0)

我不确定您在来源中做错了什么,因为您还没有包含colorSpace的整个范围。这是我尝试过的,静态分析器不抱怨:

- (UIImage *)decompressImage:(UIImage *)image {
  CGImageRef imageRef = image.CGImage;
  size_t width = CGImageGetWidth(imageRef);
  size_t height = CGImageGetHeight(imageRef);

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8,
                                               width * 4, colorSpace,
                 kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
  CGColorSpaceRelease(colorSpace);
  if (!context)
    return image;

  CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), imageRef);
  CGImageRef decompressedImageRef = CGBitmapContextCreateImage(context);
  CGContextRelease(context);

  UIImage *decompressedImage = [UIImage imageWithCGImage:decompressedImageRef scale:image.scale orientation:image.imageOrientation];
  CGImageRelease(decompressedImageRef);
  return decompressedImage;
}

确保在范围结束前每ReleaseCreate