管理CGImageRef内存的规则?

时间:2013-04-18 18:41:10

标签: ios objective-c cocoa-touch automatic-ref-counting

使用ARC管理CGImageRef的内存有哪些规则?也就是说,有人可以帮我找到正确的文档吗?

我从照片库中获取图片并创建UIImage以显示:

CGImageRef newImage = [assetRep fullResolutionImage];
...
UIImage *cloudImage = [UIImage imageWithCGImage:newImage scale:scale orientation:orientation];

我需要CGImageRelease(newImage)吗?

我正在收到内存警告,但它似乎似乎是我尚未发布的对象的逐渐堆积,而且我没有看到任何与Instruments有任何泄漏。我很困惑。

1 个答案:

答案 0 :(得分:7)

不,您无需致电CGImageRelease()的{​​{1}}便捷方法({1}}或CGImageRef来回ALAssetRepresentation。不幸的是,目前这些方法的文档和头文件并没有说清楚。

如果您使用其中一个fullResolutionImage函数自己创建fullScreenImage,那么您拥有它并负责使用CGImageRef释放该图像引用。相反,CGImageCreate*()CGImageRelease()返回的CGImageRef似乎是“自动释放”的,因为您不拥有这些方法返回的图像引用。例如,假设你在代码中尝试这样的事情:

fullResolutionImage

如果您运行静态分析器,它将为fullScreenImage行发出以下警告:

  

对象的引用计数的不正确减少   此时由来电者拥有

请注意,无论您的项目是否设置为使用手动参考计数或ARC,您都会收到此警告。

相比之下,例如CGImageRef newImage = [assetRep fullResolutionImage]; ... UIImage *cloudImage = [UIImage imageWithCGImage:newImage scale:scale orientation:orientation]; CGImageRelease(newImage); CGImageRelease(newImage);方法的文档会使返回的NSBitmapImageRep更自动释放:

  

<强> CGImage

     

从接收器返回Core Graphics图像对象   当前位图数据。

     

CGImageRef

     

返回值

     

根据接收器返回自动释放的- (CGImageRef)CGImage opaque类型   当前位图数据。