字体字形 / UIWebView 中的内存泄漏

Posted

技术标签:

【中文标题】字体字形 / UIWebView 中的内存泄漏【英文标题】:Memory leak in Font Glyph / UIWebView 【发布时间】:2012-03-13 11:13:26 【问题描述】:

我刚刚发现当 UIwebview 被释放时,它使用的大部分内存并没有被完全回收。在做了一些配置文件后,我发现大部分还活着的内存是字体字形缓存(如果你打开一个中文网页,问题会更糟,因为中文有更多的字符,这意味着更多的字体字形)。

有什么方法可以控制缓存吗?我正在使用 ios 网络浏览器,这个问题阻止了我 2 周。

Attached 是一个简单的重现演示。 1) 使用内存“分配配置文件”运行演示。 2) 在地址栏中输入http://www.163.com 等待加载完成。 3)可以看到instrument工具消耗了大约10M内存。 4)点击清除按钮(UIwebview将从可视化树中移除并被回收) 5) 你仍然可以看到大约 9M 内存。

顺便说一句,NSURLCache 被下面的代码禁用,以分离问题。 [[NSURLCache sharedURLCache] setMemoryCapacity:1]

【问题讨论】:

我正在尝试调查 Mobile safari 如何处理此问题。有什么办法可以用 otool 打印导入符号表? otool -ov 打印此应用程序中定义的所有符号,但我想知道此应用程序从其他动态库链接的符号。我使用class-dump-z转储所有头文件,但没有得到任何有用的信息。 实际问题在CoreGraphics中的draw_glyphs,在CGFontCreateGlyphBitmap之后,位图被缓存了,我们无法控制缓存。这不是泄漏,但在 iPad1 上,这对我的应用程序来说确实是个问题(有很多文字) 你找到答案了吗?我也在尝试避免 UIWebView 字体内存问题。 @jim.huang 附加演示的链接已损坏。我想我在Unable to Completely Reclaim Memory Usage from UIWebView 遇到了完全相同的问题。 【参考方案1】:

我们在生产应用程序中发现了类似的问题。我减少了重复清除 Web 视图(加载“”)然后在 UIWebView 中加载以下 URL 的错误:

http://typecast.com/preview/google/Mr%20Bedfort/Sigmar%20One/Miss%20Fajardose

这会在大约 180 次加载后可靠地使应用程序崩溃。我已向 Apple 提交了一份错误报告,问题 ID 为 15659596,我正在等待回复。

但是,我仍然不清楚在什么情况下会发生这种情况以及何时不会发生这种情况。显然,该 URL 会发生这种情况,但我也测试了相同的过程:

    在我们的应用程序中发现该问题的相同 Web 内容 “猫”和“狗”等字词的 Google 图片搜索。

在这两种情况下,都不会出现问题。我观察到内存使用量没有长期增长,应用程序也没有崩溃。

因此,我无法为您提供任何答案,但我可以确认 UIWebView 确实存在问题,我已向 Apple 报告了该问题,并且它似乎与网络字体有关。

【讨论】:

以上是关于字体字形 / UIWebView 中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

UIWebView 是不是泄漏内存?

iPhone - 内存泄漏 - NSData dataWithContentsOfUrl & UIWebView

RuntimeException:无法制作本机字体或自定义 TextView 加载字体的内存泄漏

用于设置自定义字体的自定义字体的内存泄漏

WKWebView中MessageHandler的内存泄漏问题解决过程

带有 uiwebviews 内存泄漏的基于页面的应用程序