我们的应用程序的主屏幕(因此是所有用户首次看到的)有几个部分,其中大部分包含用户可能想要打开的不同webview。这样做可以将内存使用量从仅仅26MB增加到85MB甚至更多(打开所有不同的webview后)。
我们发现的问题是,一旦它们关闭,所有网页资源似乎都保存在内存中(使用的内存可能几乎不会减少几MB)。
我想释放webview必须打开的资源,因为,稍后,我们的应用程序中有一个非常苛刻的部分需要大量内存并且如果您正好浏览几个应用程序而完全崩溃应用程序以前的那些网页浏览。
我在互联网上找到了几个选项,但到目前为止它们都没有。事情如:
// Try to clean used webview
[self.webView loadHTMLString:@"" baseURL:nil];
[self.webView stopLoading];
self.webView.delegate = nil;
[self.webView removeFromSuperview];
self.webView = nil;
他们对内存使用几乎没有任何影响。这里有什么我想念的吗?我已经仔细检查过我没有泄漏可以保持WebView打开,我已经释放了我对它的唯一引用(self.webView = nil;
)
编辑:我刚从头创建了一个项目,添加了一个webview和一个按钮,每次点击它时都会加载一个不同的网页,从而增加了内存使用量。我还添加了一个按钮,在点击时会破坏webview,并猜测,内存保持不变,就像它实际上没有释放任何资源一样。
答案 0 :(得分:17)
自从我提出这个问题以来已经有好几个月了,似乎没有人知道任何工作,所以我只是回答自己要给它一些关闭,不幸的是,对于那些拥有它的人来说,这是个坏消息。同样的问题。
我们一直试图解决这个问题好几天,并且在与一些人暗示我们与之无关之后与他们交谈(这只是一个不同的过程,照顾我们所拥有的一切没有访问权限,我们决定限制webview访问自定义页面。
例如,我们有一个新闻栏目在互联网上打开网站。我们最终做的是开放的定制网页,其中包含标题,正文和与新闻相关的图像(这仍然增加了资源内存的使用,但我们设法将其保持在一个包含的小格式中,需要数千个要打开的新闻有任何危险)。我知道,不理想。
我仍然希望看到这个问题的一些建设性的答案,无论是解决方案,解决方案,还是任何可以帮助未来用户解决同一问题的想法都有关于如何处理它的线索
答案 1 :(得分:7)
你应该阅读杰森贝克的这篇文章,
http://www.codercowboy.com/code-uiwebview-memory-leak-prevention/
他创建了一个category
,它真的帮助我重新调整了UIWebView的内存占用量。
添加类别
后,您只需要调用两行-(void) dealloc
{
[self.webview cleanForDealloc];
self.webview = nil;
[super dealloc];
}
答案 2 :(得分:1)
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
categoryWebView.stopLoading()
categoryWebView.removeFromSuperview()
categoryWebView = nil
URLCache.shared.removeAllCachedResponses()
URLCache.shared.diskCapacity = 0
URLCache.shared.memoryCapacity = 0
if let cookies = HTTPCookieStorage.shared.cookies {
for cookie in cookies {
HTTPCookieStorage.shared.deleteCookie(cookie)
}
}
}