在我们系统的其他地方寻找内存泄漏,我创建了一个带有元刷新标签的 20 MB 网页。这个想法是通过我们的数据路径代码移动大量数据以确认内存稳定性。
<html>
<meta http-equiv="refresh" content="1">
<body>
<div style="border: 1px solid red">
Content loading
</div><!-- 20mb worth of comments -->
</body>
</html>
我发现 uiwebview 显示元刷新页面非常非常快地泄漏内存。应用程序内存在大约 2 分钟内达到 300mb,并在内存不足的警告中被击中,即使我们的代码没有运行也是如此。
我已停止刷新加载并尝试解除 webview 的分配。
我试过 loadurl:"about:blank", loadhtml:"", javascript 文档关闭。
我还尝试编写递归 removeFromSuperview 和 removeFromParentViewController,读到 webview 中的私有滚动视图是内存问题,但该内存永远不会被释放。当我们完成它时,我似乎找不到一种可靠的方法来关闭、解除 web 视图。
很长一段时间以来,我们一直生活在缓慢的 webview 泄漏率中,并且真的想找到一种方法来确保在我们完成后可以完全清理 webview。我们最近将应用程序转换为 ARC,它不会改变内存速率。
我正在考虑尝试对 webview 中的所有对象进行递归循环,看看它们是否可以被释放。对于 20MB 页面的每次刷新,instruments 都会显示 20mb 的 cfdata,但不会将它们显示为泄漏。如果我只提供响应头并完成到 urlprotocol 客户端,我们可以稳定运行,所以可以确认其余数据路径中的 memleaks,但这是一个如此戏剧性的测试用例结果,我希望找到一个 webview 内存泄漏解决方案一次并为所有人。
有没有人有更好的想法,或者有没有人尝试通过 uiwebview 中的对象递归?