用ARC管理CGImageRef的内存的规则是什么?也就是说,有人可以帮助我提供正确的文档吗?

我正在从照片库获取图像并创建一个UIImage来显示:

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

我需要做CGImageRelease(newImage)吗?

我收到内存警告,但这似乎不是我尚未释放的对象的逐步积累,并且我看不到Instruments有任何泄漏。我很困惑。

最佳答案

不,您不需要在CGImageRelease()的便捷方法(如CGImageRefALAssetRepresentation)返回的fullResolutionImage上调用fullScreenImage。不幸的是,目前,这些方法的文档和头文件还不清楚。

如果您使用CGImageRef函数之一自己创建了CGImageCreate*(),则您拥有它,并负责使用CGImageRelease()释放该图像引用。相反,从CGImageReffullResolutionImage返回的fullScreenImage似乎是“自动释放”的,因为您不拥有这些方法返回的图像ref。例如,假设您尝试在代码中执行以下操作:

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

如果运行静态分析器,它将对CGImageRelease(newImage);行发出以下警告:

不正确的对象引用计数递减不正确
此时 call 者拥有的

请注意,无论您的项目设置为使用“手动引用计数”还是ARC,您都将收到此警告。

相反,例如CGImage NSBitmapImageRep 方法的文档使返回的CGImageRef自动发布这一事实更加清楚:

CGImage

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

- (CGImageRef)CGImage
返回值

根据接收者的返回一个自动释放的CGImageRef不透明类型
当前的位图数据。

关于ios - 管理CGImageRef内存的规则?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16090708/

10-11 12:30