建立并分析泄漏检测的误报?

ste*_*vex 4 objective-c automatic-ref-counting

我有这个代码:

- (CGImageRef)createImageWithContext:(CGContextRef)context
{
    return CGBitmapContextCreateImage(context);
}

- (void)fooWithContext:(CGContextRef)context
{
    CGImageRef imgRef = [self createImageWithContext:context];
    CGImageRelease(imgRef);
}
Run Code Online (Sandbox Code Playgroud)

这是一个在Xcode中构建的Objective-C项目,启用了ARC.构建和分析报告两个错误:一个在CGBitmapContextCreateImage行上标识潜在的泄漏,一个在CGImageRelease上,注意到"调用者此时不拥有的对象的引用计数的不正确减少".

如果我将这两个函数合并为一个:

- (void)fooWithContext:(CGContextRef)context
{
    CGImageRef imgRef = CGBitmapContextCreateImage(context);
    CGImageRelease(imgRef);
}
Run Code Online (Sandbox Code Playgroud)

我没有得到任何警告.

静态代码分析bug?或者我在这里遗漏了什么?

BJ *_*mer 9

根据标准的Cocoa命名约定,以单词开头的方法create应返回非拥有引用.您正在返回一个保留的对象,但您应该返回一个未保留的对象.因此,当分析器查看时-createImageWithContext:,它会看到它应该返回一个非保留对象,但实际上是返回一个保留对象.因此第一次警告.

-fooWithContext:,它查看你的代码并说"嘿,根据我的命名惯例,createImageWithContext:应该返回一个非拥有的引用.但是然后他们发布了他们不拥有的东西!那太糟糕了!" 因此第二次警告.

你可以通过改变名称解决这个问题-createImageWithContext:的东西,开头new,如-newImageWithContext:.或者您可以使用cf_returns_retained来注释方法,以向静态分析器指示该方法正在返回拥有的引用.