CGContextClip上的XCode Analyzer潜在内存泄漏

时间:2014-06-17 03:16:07

标签: objective-c xcode memory-leaks static analysis

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;
}

enter image description here

1 个答案:

答案 0 :(得分:1)

According to this

  

Core Foundation函数的名称表明您拥有的时间   返回的对象:

     
      
  • 在名称中嵌入“创建”的对象创建函数;
  •   
  • 在名称中嵌入“复制”的对象复制功能。
  •   
     

如果你拥有一个物品,你有责任放弃   完成后的所有权(使用CFRelease)。

and also Transitioning to ARC Release Notes

  

编译器不会自动管理Core Foundation对象的生命周期;您必须按照Core Foundation内存管理规则的要求调用CFRetainCFRelease(或相应的特定于类型的变体)。

您在此处创建了path

CGPathRef path = CGPathCreateWithEllipseInRect(CGRectMake(0, 0, self.size.width, self.size.height), NULL);

但你没有发布它。 path被泄露了。所以,你得到了警告。


要解决此问题,请在使用path

后添加以下代码
CFRelease(path);