开发者

Why is this an over-release of CTFrame

开发者 https://www.devze.com 2023-01-09 03:52 出处:网络
Working with some CoreText code on iOS and I am confused as to why this is an overrelease of the CTFrame.I have confirmed it is an over-release but I am baffled because it is created with a create met

Working with some CoreText code on iOS and I am confused as to why this is an overrelease of the CTFrame. I have confirmed it is an over-release but I am baffled because it is created with a create method.

for (NSValue *value in [self frameArray]) {
  CGRect column = [value CGRectValue];
  CGMutablePathRef path = CGPathCreateMutable开发者_JAVA百科();
  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);
}

Update

The code base is 3.2 and the crash does not occur on the first release. It occurs "randomly" at some point while drawing the view. This loop, as you can probably guess is in the -drawRect: of the view. There is no multi-threading in this application.


Turns out that Jason was on the right track and that the issue was passing in a empty framesetter to the CTFramesetterCreateFrame function which then returned NULL.


That's because your drawRect: method gets called in the end of run loop. That's why your app crashes randomly.

So your solution is to create global link to CTFrame object and release that object only in dealloc and when you're creating other CTFrame object (and replacing your global link).

0

精彩评论

暂无评论...
验证码 换一张
取 消