【问题标题】:XCode Analyzer potential memory leak on CGContextClipCGContextClip 上的 XCode Analyzer 潜在内存泄漏
【发布时间】:2014-06-17 03:16:06
【问题描述】:

xcode 分析器说在使用 CGContextClip 时存在存储到“路径”上的潜在内存泄漏。什么会导致这种潜在的内存泄漏?

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

【问题讨论】:

  • 您可以点击右侧“潜力...”之前的蓝色图标。 Xcode 会告诉你它是如何泄露的。

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


【解决方案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);

【讨论】:

  • 既然我使用的是 Arc,它不会为我做发布吗?
  • 非常感谢您的回答。幸好我运行了分析器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多