【发布时间】:2023-04-07 08:10:02
【问题描述】:
在我们系统的其他地方寻找内存泄漏,我创建了一个带有元刷新标签的 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 document close.
我还尝试编写递归 removeFromSuperview 和 removeFromParentViewController,读到 webview 中的私有滚动视图是内存问题,但该内存从未释放。我似乎无法找到一种可靠的方法来关闭,在我们完成后解除 webview 的分配。
很长一段时间以来,我们一直生活在缓慢的 webview 泄漏率中,并且真的想找到一种方法来确保在我们完成后可以完全清理 webview。我们最近将应用程序转换为 ARC,它不会改变内存速率。
我正在考虑尝试对 web 视图中的所有对象进行递归循环,看看它们是否可以被释放。对于 20MB 页面的每次刷新,instruments 都会显示 20mb 的 cfdata,但不会将它们显示为泄漏。如果我只提供响应头并完成到 urlprotocol 客户端,我们可以稳定运行,所以可以确认其余数据路径中的 memleaks,但这是一个如此戏剧性的测试用例结果,我希望能找到一次 webview 内存泄漏解决方案并为所有人。
有没有人有更好的想法,或者有没有人尝试过递归浏览 uiwebview 中的对象?
【问题讨论】:
-
当应用程序显示没有泄漏,但数据不断增长时,这意味着对象在某处还活着。找到它们(查看它们在工具中的保留/释放历史记录)
标签: ios memory uiwebview refresh memory-leaks