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