首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Analyzer关于错误递减的警告

Analyzer关于错误递减的警告
EN

Stack Overflow用户
提问于 2012-06-11 15:48:56
回答 1查看 616关注 0票数 3

我收到了一个关于某些CGImageRef对象的静态分析器警告。警告是“不正确地递减此时不归调用者所有的对象的引用计数”。但是,我希望它归调用者所有。我需要在Obj-C方法中插入一些特殊的文字吗?当我创建一个C函数来逐行执行完全相同的事情时,警告消失了。我之所以将它们分开,是因为我的应用程序有时使用CGImage (用于编辑),有时使用UIImage (用于设置UIImageView)。

下面是相关的代码(精简到相关的要点):

代码语言:javascript
复制
+ (UIImage *)imageFromCompressedData:(NSData *)compressedData withSize:(CGSize)size
{    
    CGImageRef cgImage = [SO2CompressionHandler cgImageFromCompressedData:compressedData withSize:size];
    UIImage *returnImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);

    return returnImage;
}

+ (CGImageRef)cgImageFromCompressedData:(NSData *)compressedData withSize:(CGSize)size
{
    //...decompress data

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)decodedData);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGImageRef outImageRef = CGImageCreate(width, height, 8, 32, 4*width, colorSpace, kCGImageAlphaPremultipliedLast, provider, NULL, false, kCGRenderingIntentDefault);
    CGDataProviderRelease(provider);

    if(CGSizeEqualToSize(CGSizeZero, size) || CGSizeEqualToSize(CGSizeMake(width, height), size))
    {
        CGColorSpaceRelease(colorSpace);
        return outImageRef; //Flagged as potential leak
    }

    //...or resize and return the in a similar way
}

在我返回CGImage之前释放它是没有意义的,对吧?那么它就只是无效的内存。那么这是不是暗示我应该使用C-functions?或者静态分析器根本不检查C函数。我把cgImageFromCompressedData:withSize:改成了CGImageCreateWithCompressedData(NSData *compressedData, CGSize size),就像变魔术一样,没有更多的警告。我应该忽略这些警告,或者它们有一些优点吗?我是否必须在我的Obj-C方法名中添加单词"new“或"alloc”才能使它们消失?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-11 15:51:27

如果你的方法返回一个+1对象,它的名字应该以'new‘开头,例如newCGImageFromCompressedData:withSize:。这将告诉分析器您故意返回一个保留的对象,并将所有权传递给调用者。

或者,您可以通过将clang属性CF_RETURNS_RETAINED放入方法声明中(即,在.h文件中)来使用它:

代码语言:javascript
复制
+(CGImageRef)cgImageFromCompressedData:(NSData *)compressedData
                              withSize:(CGSize)size CF_RETURNS_RETAINED;

这也告诉分析器,该方法应该返回一个保留的对象,但不必更改方法选择器。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10976210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档