xcode Analyzer表示使用CGContextClip时存在潜在的内存泄漏存储在'path'上。什么会导致这种潜在的内存泄漏?
- (UIImage *)imageMaskToEllipseWithBorderWidth:(float)boarderWidth andBorderColor:(UIColor *)borderColor
{
UIGraphicsBeginImageContextRetinaAware( self.size );
CGContextRef context = UIGraphicsGetCurrentContext();
CGPathRef path = CGPathCreateWithEllipseInRect(CGRectMake(0, 0, self.size.width, self.size.height), NULL);
CGContextAddPath(context, path);
CGContextClip(context); // *** Warning is shown here during static analysis ***
[self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)];
if( boarderWidth > 0 && borderColor != nil )
{
[borderColor set];
CGContextSetLineWidth(context, 2.0);
CGContextStrokeEllipseInRect(context, CGRectMake(0, 0, self.size.width, self.size.height));
}
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
答案 0 :(得分:1)
Core Foundation函数的名称表明您拥有的时间 返回的对象:
- 在名称中嵌入“创建”的对象创建函数;
- 在名称中嵌入“复制”的对象复制功能。
如果你拥有一个物品,你有责任放弃 完成后的所有权(使用
CFRelease
)。
and also Transitioning to ARC Release Notes:
编译器不会自动管理Core Foundation对象的生命周期;您必须按照Core Foundation内存管理规则的要求调用
CFRetain
和CFRelease
(或相应的特定于类型的变体)。
您在此处创建了path
,
CGPathRef path = CGPathCreateWithEllipseInRect(CGRectMake(0, 0, self.size.width, self.size.height), NULL);
但你没有发布它。 path
被泄露了。所以,你得到了警告。
要解决此问题,请在使用path
,
CFRelease(path);