2

我有一个简单的方法,它接受一个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被调用时,retain 会自动被调用frameRef。我不必担心frameRef在返回时释放它,因为它存储在newFrameRef其中并且保留计数保持不变。我只需要担心释放newFrameRef( CTRelease(newFrameRef))。它是否正确?

更新:我实际上仍然因此而发生内存泄漏,一个在返回线处,另一个在我发布“newFrameRef”的地方

4

1 回答 1

1

C 接口 API 从旧的 Foundarion Kit 命名指南中汲取灵感,该指南有两个不同的(且有用的)命名约定,称为Get RuleCreate Rule。为简洁起见:任何包含该词create的 C 函数都会返回一个您必须手动管理的引用。因此,要回答您的问题,是的,您确实需要发布它CTFramesetterRef,因为您现在手上有泄漏。

于 2012-08-03T05:49:32.307 回答