使用返回值管理 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的应用

koa框架异步返回值的操作(co,koa-compose)

求救:CO09和BAPI_MATERIAL_AVAILABILITY的返回值数量不同

使用 CoreGraphics 绘制自定义 UIView

使用 CoreGraphics 循环绘制会产生性能问题

Java中使用有返回值的线程