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】:
只有当您使用CGImageCreate
、Copy
或Retain
(或任何此类与创建、复制、保留相关的方法。例如:-CGBitmapContextCreateImage
)时,您才需要调用CGImageRelease
。在这种情况下,您不必这样做,因为您没有进行任何创建、复制或保留。
【讨论】:
或任何其他名称中带有Create
的函数,例如CGBitmapContextCreateImage
。
@PeterHosey,你是对的。从那条线可能不清楚。我也添加了。感谢您的建议。【参考方案2】:
不,CGImage 将绑定到 UIImage 的生命周期
遵循 cocoa 的“创建规则”:您只需要释放您拥有的东西(来自名为 new*、copy*、retain 的方法中的对象返回所有权)
此外,来自 CF 的任何对象,都遵循 CF 创建规则(仅来自名为 Create*、Copy*、Retain 的方法的对象)
【讨论】:
您基本上是对的,但是您将两个规则集混为一谈,并错误地陈述了它们。 Cocoa 规则集(也在 Cocoa Touch 中使用)是任何名称包含alloc
、new
、copy
或 retain
的方法都返回所有权。核心基础规则集是任何名称包含Create
、Copy
或Retain
的函数都返回所有权。 Cocoa 规则不包括create
(CF 规则不包括New
)。
然后编辑我的答案 - 我不明白......没有人明白! ..\
我不能代表任何人,但我的规则是不要进行会改变海报含义的编辑。修正错别字、拼写和格式,当然,但在更正事实时,我会发表评论,以便发帖者(在这种情况下,是你)更有可能看到它。以上是关于CGImageRef cg = [[UIImage imageNamed: Path] CGImage];需要 CGImageRelease(cg)'?的主要内容,如果未能解决你的问题,请参考以下文章