我收到有关某些 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”才能使它们消失?