0

我用分配工具检查了我的应用程序,发现这里的代码导致了分配问题。该方法返回填充了传递的属性字符串的平方区域的建议高度;我需要这个来计算我需要多少空间来绘制该文本然后生成书页:

- (CGFloat)boundingHeightForWidth:(CGFloat)inWidth ForAttributedString:(NSAttributedString *)attributedString
{
     CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFMutableAttributedStringRef)attributedString);
     CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, CGSizeMake(inWidth, 10000), NULL);
     CFRelease(framesetter);
     return suggestedSize.height ;
}

由于我在流程中多次调用此方法,我想知道这是如何导致高达 7MB 的内存分配的。我认为释放帧设置器就足够了,我错了吗?

4

1 回答 1

0

我对这个问题做了一些详细的WRT调试,你可以在我对这个问题的回答中找到结果。您可以尝试几件事。1,您的应用程序是否在辅助线程中进行这些分配,如果是,那么将它们移动到主线程会使丢失的内存消失吗?第二,您可以保留 CTFramesetterRef,然后使用相同的框架设置器一遍又一遍地调用 CTFramesetterSuggestFrameSizeWithConstraints。泄漏似乎在 CTFramesetterCreateWithAttributedString() 调用中,因此也许您可以通过不多次调用该方法来最小化泄漏。

于 2013-06-28T08:33:59.060 回答