2

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

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

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

我需要做CGImageRelease(newImage)吗?

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

4

1 回答 1

8

不,您不需要调用返回CGImageRelease()的便捷方法,例如or 。不幸的是,目前,这些方法的文档和头文件并没有说明这一点。CGImageRefALAssetRepresentationfullResolutionImagefullScreenImage

如果您CGImageRef使用其中一个CGImageCreate*()功能自己创建了一个,那么您拥有它并负责使用CGImageRelease(). 相比之下,返回的sCGImageRef似乎是“自动释放的”,因为您不拥有这些方法返回的图像引用。例如,假设您在代码中尝试这样的事情:fullResolutionImagefullScreenImage

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

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

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

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

相比之下,例如,CGImage方法的文档使返回的自动释放这一事实更加清楚:NSBitmapImageRepCGImageRef

CG图像

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

- (CGImageRef)CGImage

返回值

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

于 2013-04-18T21:19:58.893 回答