我收到一些关于某些CGImageRef对象的静态分析器警告。警告是“调用者此时不拥有的对象的引用计数的不正确的减少”。但是,我希望它由调用者拥有。我需要在我的Obj-C方法中插入一些特殊的措辞吗?当我使用C函数执行字面行以完全相同的事情时,警告消失。我将它们分开的原因是因为有时我的应用程序使用CGImage(用于编辑),有时它使用UIImage(用于设置UIImageView)。
以下是相关代码(简要介绍其相关要点):
+ (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函数?或者静态分析仪根本不检查C函数。我将cgImageFromCompressedData:withSize:
更改为CGImageCreateWithCompressedData(NSData *compressedData, CGSize size)
并且像魔术一样,没有更多警告。我应该忽略这些警告,还是有一些优点?我是否必须在我的Obj-C方法名称中添加单词“new”或“alloc”以使它们消失?
答案 0 :(得分:7)
如果您的方法返回+1对象,则其名称应以“new”开头,例如newCGImageFromCompressedData:withSize:
。这将告诉分析器您故意返回一个保留对象并将所有权传递给调用者。
或者,您可以将clang属性CF_RETURNS_RETAINED
放在方法声明中(即在.h文件中):
+(CGImageRef)cgImageFromCompressedData:(NSData *)compressedData
withSize:(CGSize)size CF_RETURNS_RETAINED;
这也告诉分析器该方法应该返回一个保留的对象,但不必更改方法选择器。