我有一个简单的方法,它接受一个 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”的地方
最佳答案
C 接口(interface) API 从旧的 Foundarion Kit 命名指南中汲取灵感,该指南有两个截然不同(且有用)的命名约定,称为 Get Rule和 Create Rule .为简洁起见:任何包含单词 create
的 C 函数都会返回一个必须手动管理的引用。因此,要回答您的问题,是的,您确实需要发布 CTFramesetterRef
,因为您现在手上有漏洞。
关于iphone - 使用返回值管理 CoreGraphics/CoreText 中的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11789835/