代码之家  ›  专栏  ›  技术社区  ›  Marcus S. Zarra

为什么这是CTFrame的过度发布

  •  7
  • Marcus S. Zarra  · 技术社区  · 14 年前

    在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 回复  |  直到 14 年前
        1
  •  3
  •   Marcus S. Zarra    14 年前

    结果发现,杰森是在正确的轨道上,问题是在传递一个空的框架制定者 CTFramesetterCreateFrame 然后返回NULL的函数。

        2
  •  0
  •   Dennis Pashkov    11 年前

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

    因此,您的解决方案是创建 CTFrame 对象并仅在 dealloc 当你创造另一个 CTFrame公司 对象(并替换全局链接)。