gpt4 book ai didi

iphone - 内存使用随着 CTFontCreateWithName 和 CTFramesetterRef 的增加而增长

转载 作者:可可西里 更新时间:2023-11-01 04:36:34 24 4
gpt4 key购买 nike

我正在编写一个使用自定义字体 (CTFontManagerRegisterFontsForURL) 的 IOS 程序。我加载字体,将其添加为字符串属性,创建框架 setter ,然后创建框架,并将其绘制到上下文中。我释放我使用的一切。仪器没有注意到泄漏,但是:

使用此功能时,应用程序使用的内存会增加,不会减少。当我离开该功能时,我的字体保留计数为 2。

代码如下:

CFMutableAttributedStringRef attributedStringRef = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);
CFAttributedStringBeginEditing(attributedStringRef);
CFAttributedStringReplaceString(attributedStringRef, CFRangeMake(0, 0), (CFStringRef)label.text);

font = CTFontCreateWithName((CFStringRef)label.fontName, label.fontHeight, NULL);

保留字体数:1

CFAttributedStringSetAttribute(attributedStringRef, CFRangeMake(0, label.text.length), kCTFontAttributeName, font);
CFAttributedStringEndEditing(attributedStringRef);

保留字体数:2

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, rect);

CFRelease(font);

保留字体数:1

CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString(attributedStringRef); 

保留字体数:3

CFRelease(attributedStringRef);
CTFrameRef frame = CTFramesetterCreateFrame(frameSetter,
CFRangeMake(0, 0),
path, NULL);

保留字体数:5

CFRelease(frameSetter);

保留字体数:4

CTFrameDraw(frame, ctx);
CFRelease(frame);

保留字体数:2

CGPathRelease(path);

是否有某种缓存?我真的需要立即刷新此字体使用的内存。

P.S:我使用 CFGetRetainCount 来获取字体的保留计数。

谢谢!

最佳答案

retainCount 没用。不要调用它。

如果您的应用程序的内存以可重复的方式增长,请使用 Heapshot Analysis弄清楚是什么在消耗内存。泄漏仅报告不再可达的对象——其地址未出现在内存的任何事件区域中的对象——因此,泄漏不会发现多种内存增生。

这可能是只写缓存的情况;即某处某处正在主动缓存内容,但您编写的代码使得永远不会检索缓存的副本。如果没有其他信息(对于初学者来说是 Heapshot Analysis 的结果),很难说。


I followed your tutorial, and it confirms that the permanent heap growth is due to the line "CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string); ". OK -- you've confirmed what is leaking and where it is allocated, but not where the extra retain comes from. To that, turn on "Record reference counts" in the Allocations instrument and re-run the test. This will allow you to inspect the backtraces of every retain/release call on the offending object. There will be an extra retain in there; a retain not balanced by a release.

我猜上下文以某种方式卡在它上面。

(I had already analyzed the memory and saw that it was occupied by this object, that's why i checked retain count.

对象的绝对保留计数是无用的。它仍然在内存中意味着它被过度保留并且保留计数本身并不能真正告诉您更多信息,除非您还拥有对该对象的每个保留(和释放)调用的完整回溯,其中 Instruments给你。

关于iphone - 内存使用随着 CTFontCreateWithName 和 CTFramesetterRef 的增加而增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8491841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com