繁体   English   中英

CTFramesetterCreateWithAttributedString导致内存泄漏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM