CGImageRef cg = [[UIImage imageNamed: Path] CGImage];需要 CGImageRelease(cg)'?

Posted

技术标签:

【中文标题】CGImageRef cg = [[UIImage imageNamed: Path] CGImage];需要 CGImageRelease(cg)\'?【英文标题】:CGImageRef cg = [[UIImage imageNamed: Path] CGImage]; Requires a CGImageRelease(cg)'?CGImageRef cg = [[UIImage imageNamed: Path] CGImage];需要 CGImageRelease(cg)'? 【发布时间】:2012-12-17 20:36:49 【问题描述】:

我正在尝试从 ios 中的图像资产中读取 ARGB 像素。为此,我需要一个CGImageRef 来获取它的CGDataProvider。我的问题是,如果我创建一个 CGImageRef 使用:

CGImageRef cg = [[UIImage imageNamed: Path] CGImage];

我最终是否需要致电CGImageRelease(cg)?如果我不调用CGImageRelease,会不会出现内存泄漏?

我遇到的另一个问题是第二次读取同一个文件会返回一个空图像,我怀疑这可能是因为我第一次没有调用CGImageRelease

【问题讨论】:

注意 ARC 下的这种模式。当您不将 Cocoa Touch 对象分配给变量时,它可能会在您有机会使用从中获得的 CF/CG 对象之前死掉。在这种情况下这可能不会发生,因为 imageNamed: 会缓存它提供给您的图像,但在 Apple 修复编译器中的问题之前,您应该更普遍地避免这种模式。 【参考方案1】:

只有当您使用CGImageCreateCopyRetain(或任何此类与创建、复制、保留相关的方法。例如:-CGBitmapContextCreateImage)时,您才需要调用CGImageRelease。在这种情况下,您不必这样做,因为您没有进行任何创建、复制或保留。

【讨论】:

或任何其他名称中带有Create的函数,例如CGBitmapContextCreateImage @PeterHosey,你是对的。从那条线可能不清楚。我也添加了。感谢您的建议。【参考方案2】:

不,CGImage 将绑定到 UIImage 的生命周期

遵循 cocoa 的“创建规则”:您只需要释放您拥有的东西(来自名为 new*、copy*、retain 的方法中的对象返回所有权)

此外,来自 CF 的任何对象,都遵循 CF 创建规则(仅来自名为 Create*、Copy*、Retain 的方法的对象)

【讨论】:

您基本上是对的,但是您将两个规则集混为一谈,并错误地陈述了它们。 Cocoa 规则集(也在 Cocoa Touch 中使用)是任何名称包含 allocnewcopyretain 的方法都返回所有权。核心基础规则集是任何名称包含CreateCopyRetain 的函数都返回所有权。 Cocoa 规则不包括create(CF 规则不包括New)。 然后编辑我的答案 - 我不明白......没有人明白! ..\ 我不能代表任何人,但我的规则是不要进行会改变海报含义的编辑。修正错别字、拼写和格式,当然,但在更正事实时,我会发表评论,以便发帖者(在这种情况下,是你)更有可能看到它。

以上是关于CGImageRef cg = [[UIImage imageNamed: Path] CGImage];需要 CGImageRelease(cg)'?的主要内容,如果未能解决你的问题,请参考以下文章

CGImageRef 到 UIImage 旋转我在模拟器或设备中的 iOS 4 上调试的照片

如何从上下文绘制的图像中获取 CGImageRef?

UIView 中的 CG 绘图用作 UIImage?

imageWithCG图像和内存

裁剪的 UIImage 方向/拉伸

第43月第10天 uiimage写文件