为什么这是CTFrame的过度释放

时间:2010-07-26 21:41:31

标签: objective-c core-text

在iOS上使用一些CoreText代码,我很困惑为什么这是CTFrame的过度发布。我已经确认它是一个过度释放但我感到困惑,因为它是使用create方法创建的。

for (NSValue *value in [self frameArray]) {
  CGRect column = [value CGRectValue];
  CGMutablePathRef path = CGPathCreateMutable();
  CGPathAddRect(path, NULL, column);
  CTFrameRef frame = CTFramesetterCreateFrame(bodyFramesetter, CFRangeMake(position, 0), path, NULL);
  CTFrameDraw(frame, context);
  position += CTFrameGetVisibleStringRange(frame).length;
  CGPathRelease(path);
  // ???: Why does this cause an overrelease?
  //CFRelease(frame);
}

更新

代码库是3.2,并且第一个版本不会发生崩溃。在绘制视图时,它会在某个时刻“随机”出现。您可以猜测,此循环位于视图的-drawRect:中。此应用程序中没有多线程。

2 个答案:

答案 0 :(得分:3)

原来,Jason走在正确的轨道上,问题是将空框架集传递给CTFramesetterCreateFrame函数,然后返回NULL。

答案 1 :(得分:0)

那是因为在运行循环结束时调用了drawRect:方法。这就是你的应用程序随机崩溃的原因。

因此,您的解决方案是创建指向CTFrame对象的全局链接,并仅在dealloc中以及在创建其他CTFrame对象(并替换全局链接)时释放该对象。