0

我不知道为什么这段简单的代码有时会导致内存泄漏(并非总是如此)。

这段代码被包装在一个 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不能在后台线程中使用?

有任何想法吗?谢谢!

4

3 回答 3

0

好的,这似乎是一个模拟器错误(至少现在是这样)。我在设备上分析了我的应用程序,内存泄漏就消失了。在多线程环境中使用核心文本时,模拟器似乎有很多内存泄漏。例如,创建一个 CTFrameSetter 并稍后将其释放到同一个 GCD 串行队列中(根据 Doc 是允许的),可能会导致随机内存泄漏。无论如何,当在真实设备中进行分析时,所有这些内存泄漏都会消失。

于 2012-07-22T17:45:05.610 回答
0

这个泄漏不仅仅是一个模拟器错误,它出现在实际设备上。请参阅我对这个相关问题的回答以深入调试内存使用量随着 CTFontCreateWithName 和 CTFramesetterRef 的增长而增长

于 2013-06-24T19:55:00.920 回答
-2

我认为您应该在 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);

这应该工作

于 2012-07-16T10:37:49.940 回答