[英]CTFramesetterCreateWithAttributedString cause memory leak
我不知道为什么这段简单的代码有时会导致内存泄漏(并非总是如此)。
这段代码包装在NSOperation中,并在NSOperationQueue队列中运行。 该操作将修剪sourceNSAString使其适合某个大小,然后将其返回到其他某个线程。
//sourceNSAString is a NSMutableAttributedString that will be set to nil elsewhere in another GCD queue.
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) sourceNSAString);
if (frameSetter) {
CFRange fitRange = {static_cast<CFIndex>(range.location), 0};
CFRange totalRange = {static_cast<CFIndex>(range.location), static_cast<CFIndex>(range.length)};
CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, totalRange, NULL, size, &fitRange);
CFRelease(frameSetter);
...... trim sourceNSAString to fit in fitRange
}
是因为:1,我不应该将sourceNSAString返回到另一个线程吗? 还是2,CTFramesetterCreateWithAttributedString不能在后台线程中使用?
有任何想法吗? 谢谢!
好的,这似乎是模拟器错误(至少现在是这样)。 我在设备上分析了我的应用程序,而内存泄漏刚刚消失了。 在多线程环境中使用核心文本时,模拟器似乎有很多内存泄漏。 例如,创建一个CTFrameSetter并在以后在同一GCD串行队列中释放它(根据Doc的允许)可能会随机导致内存泄漏。 无论如何,在真实设备中进行分析时,所有这些内存泄漏都会消失。
此泄漏不仅是模拟器错误,它还会显示在实际设备上。 请参阅我对这个相关问题的答案以进行深入调试, 随着CTFontCreateWithName和CTFramesetterRef的使用,内存使用量会增加
我认为您应该在if语句之后释放frameSetter,因为如果不执行if语句,frameSetter不会被释放。
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) sourceNSAString);
if (frameSetter) {
CFRange fitRange = {static_cast<CFIndex>(range.location), 0};
CFRange totalRange = {static_cast<CFIndex>(range.location), static_cast<CFIndex>(range.length)};
CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, totalRange, NULL, size, &fitRange);
}
CFRelease(frameSetter);
这应该工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.