在分析我的应用程序时,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);
但是,我不确定到底出了什么问题,或者如何修复它。有没有人有什么建议?
答案 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;
}
确保在范围结束前每Release
个Create
。