使用ARC管理CGImageRef
的内存有哪些规则?也就是说,有人可以帮我找到正确的文档吗?
我从照片库中获取图片并创建UIImage
以显示:
CGImageRef newImage = [assetRep fullResolutionImage];
...
UIImage *cloudImage = [UIImage imageWithCGImage:newImage scale:scale orientation:orientation];
我需要CGImageRelease(newImage)
吗?
我正在收到内存警告,但它似乎似乎是我尚未发布的对象的逐渐堆积,而且我没有看到任何与Instruments有任何泄漏。我很困惑。
答案 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类型 当前位图数据。