CoreGraphics 对象自动释放次数过多

CoreGraphics object autoreleased too many times

在分析我的应用程序后,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);

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

我不确定您在源代码中做错了什么,因为您没有包含 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;
}

只需确保在范围结束前每个 Create 都有一个 Release