我有一个简单的方法,它接收一个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”
答案 0 :(得分:1)
C-interface API从旧的Foundarion Kit命名指南中获取提示,该指南有两个不同的(也是有用的)命名约定,称为Get Rule和Create Rule。为简洁起见:任何包含单词create
的C函数都会返回您必须手动管理的引用。所以要回答你的问题,是的,你确实需要释放CTFramesetterRef
,因为你现在手上有泄漏。