UIWebView内存管理

18

我在内存管理方面遇到了问题。

我正在开发一个使用UIWebView频繁的应用程序。该应用程序在从我的服务器加载内容时动态生成大量的UIWebView。其中一些UIWebView很大,包含了许多图片。

如果我使用工具检测泄漏,我检测不到任何泄漏。然而,许多对象被分配了,我怀疑与UIWebViews有关。

当webviews因不再需要而释放时,似乎并没有释放所有的内存。我的意思是,在向我的服务器发出请求后,应用程序创建了一个UITableView和许多Webviews(仪器显示约8Mb)。当用户点击返回按钮后,它们都会被释放,但内存使用量只减少了2-3 Mb,并且在使用该应用程序5-10分钟后就会崩溃。

我是否漏掉了什么? 有人知道可能发生了什么吗?

谢谢!


你能否请看一下我的解决方案:https://dev59.com/THA65IYBdhLWcg3w4C0L#21250327 - NeverHopeless
4个回答

7
这不是一个解决方案,而是对你面临问题的可能解释。
我曾经开发过一款应用程序,遇到了内存问题。应用程序实际上包含一个滚动视图,其中包含 3 个全屏幕大小的 Web 视图。每个 webview 的内容尺寸都有多个屏幕,平均大约有 10 页。
当你加载一个 webview 时,整个视图都会在内存中呈现。因此,除了用于加载图像和其他数据(在 Allocations 工具中看到的东西)的内存之外,当它被呈现时,web 视图本身会使用一些无法控制的内存。
例如,一个 768x1024 的 webview,具有 10 页内容,将使用:
768 * 1024 * 10 (页面) * 4 (位每像素) = 31,457,280 = 30MB。
将其乘以 3 个 web 视图,这就是除应用程序直接分配的内存之外使用的 90MB。
你可以通过使用 VM Tracker 工具在 Instruments 中获取正在使用的内存量。

这里有一个好的方法:https://dev59.com/fWkw5IYBdhLWcg3wEmWb - CarlJ

5

尝试添加

[webView loadHTMLString: @"" baseURL: nil];

在释放Webview之前,针对4.2.1版本中UIWebView显示PDF文件导致的内存泄漏问题,这个解决方案可以解决大部分的泄漏问题。


在使用Webview加载更多图片时遇到了同样的问题。如何在ARC中修复这个问题? - Gobi M

1
在你的 viewWillDisappear 方法中写入以下内容:
[WebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];

3
因为这没有解释,所以我给它点了踩。它可能是正确的,也可能不是,但是完全没有解释,你无法相信这个答案。 - Roy Leban
@RoyLeban 对不起,这是我的错误,我道歉了,现在我已经添加了描述,谢谢 :) - Dhaval Parmar
2
我会给这个点踩,因为如果一个网页在iPhone上显示视频,它会通过全屏显示视频播放器来实现。这会触发willDisappear方法,从UIWebView中移除当前网页,并导致视频立即停止播放。 - Ash

0

如果您在同一视图控制器实例中添加多个子视图,则必须在添加新的子视图之前从父视图中删除旧的子视图。

在将UIWebView添加为子视图之前,请为其添加标记:

webView.tag  = 10;
[self.view addSubview:webView];

webView = nil;

在添加新的Web视图之前(这将清除旧视图),请从父视图中删除子视图:
UIWebView * oldWebView = (UIWebView *)[self.view viewWithTag:10];
[oldWebView removeFromSuperview];

如果您不从父视图中删除旧的Web视图,则它们将在内存中累积,直到您释放视图控制器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接