使用返回值管理 CoreGraphics / CoreText 中的内存
Posted
技术标签:
【中文标题】使用返回值管理 CoreGraphics / CoreText 中的内存【英文标题】:Managing Memory in CoreGraphics / CoreText with Return Values 【发布时间】:2012-08-03 05:35:18 【问题描述】:我有一个简单的方法,它接受一个CTFramesetterRef
对象并从中构建一个CTTextFrameRef
,如下所示:
- (CTFrameRef) createFrameRefWithFramesetterRef:(CTFramesetterRef)framesetterRef
CTFrameRef frameRef = CTFramesetterCreateFrame(framesetterRef, CFRangeMake(0, 0), self.mutablePathRef, NULL);
return frameRef;
然后在另一种方法中调用上述方法:
- (void) someMethod
CTFramesetterRef framesetterRef = CTFramesetterCreateWithAttributedString((CFMutableAttributedStringRef)self.text);
CTFrameRef newFrameRef = [self createFrameRefWithFramesetterRef:framesetterRef];
//do some stuff
CTRelease(newFrameRef);
CTRelease(framesetterRef);
我只是想验证我是否在此处正确管理了内存,因为我是使用 CoreGraphics
的新手。当CTFramesetterCreateFrame
被调用时,在frameRef
上自动调用retain。我不必担心在返回时释放frameRef
,因为它存储在newFrameRef
中并且保留计数保持不变。我只需要担心释放newFrameRef
(CTRelease(newFrameRef)
)。这是正确的吗?
更新:我实际上仍然从中得到内存泄漏,一个在返回行,一个在我释放“newFrameRef”的地方
【问题讨论】:
【参考方案1】:C 接口 API 从旧的 Foundarion Kit 命名指南中汲取灵感,该指南有两个不同(且有用)的命名约定,称为 Get Rule 和 Create Rule。为简洁起见:任何包含单词create
的C 函数都会返回一个您必须手动管理的引用。因此,要回答您的问题,是的,您确实需要发布 CTFramesetterRef
,因为您现在手上有漏洞。
【讨论】:
忘记发布 CTFramesetterRef 只是我的疏忽,我改变了这一点。再次感谢! 没问题。无论如何,目标 c 的 c 部分记录得很差。以上是关于使用返回值管理 CoreGraphics / CoreText 中的内存的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发CoreGraphics核心图形框架之一——CGPath的应用