在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:
中。此应用程序中没有多线程。
答案 0 :(得分:3)
原来,Jason走在正确的轨道上,问题是将空框架集传递给CTFramesetterCreateFrame
函数,然后返回NULL。
答案 1 :(得分:0)
那是因为在运行循环结束时调用了drawRect:
方法。这就是你的应用程序随机崩溃的原因。
因此,您的解决方案是创建指向CTFrame
对象的全局链接,并仅在dealloc
中以及在创建其他CTFrame
对象(并替换全局链接)时释放该对象。