UIWebView 内存泄漏。释放未使用资源的魔法是什么?
UIWebView memory leaks. What is the magic to release unused resources?
虽然有很多关于这个主题的讨论,但我仍然没有找到答案。
问题是,UIWebView加载一个页面后,永远不会释放所有使用的内存资源。
我创建了一个空项目。刚刚添加了 UIWebView。加载请求前使用的内存 (http://methodhome.com/cleanhappy) 为 4.5MB,加载完成后 - 70 ~ 90 MB。
释放UIWebView后,使用的内存还是55MB
所以看起来有大约 50MB 的内存泄漏。
我尝试了以下方法:
[_webView stringByEvaluatingJavaScriptFromString:@"var body=document.getElementsByTagName('body')[0];body.style.backgroundColor=(body.style.backgroundColor=='')?'white':'';"];
[_webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML='';"];
[_webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"];
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
[_webView loadHTMLString:@"" baseURL:nil];
[_webView stopLoading];
_webView.delegate = nil;
[_webView removeFromSuperview];
_webView = nil;
[[NSURLCache sharedURLCache] removeAllCachedResponses];
我也试过设置:
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
并玩过内存和磁盘的缓存设置。
没有任何帮助。
这怎么可能?流行的浏览器是如何像 Safari 和 Chrome 那样工作的呢?释放那些资源的技巧是什么?
How can it be possible?
UIWebView
是旧的 API,基于 WebKitLegacy。它没有因为 1 个单一原因而被弃用 - Apple 没有替代品(直到 iOS 9)。
How are the popular browsers are working like Safari and Chrome with
such a leaks.
Safari 是一个浏览器,由Apple 自己创建。它可以使用任何 hack 和私人 APIs,在 AppStore 中受到限制。实际上,目前 Safari 的行为非常接近 WKWebView
的行为。但它从未与 UIWebView
.
相似
最近 Google Chrome 才能够迁移到 WKWebView
。有关详细信息,请参阅 https://bugs.chromium.org/p/chromium/issues/detail?id=423444。在此之前,Google Chrome 也面临同样的问题。
What is the trick to release those resources?
我尝试了很多技巧,但 none 对我有用。不幸的是,唯一的解决方案是迁移到WKWebView
,在iOS 8中引入。此外,WKWebView
在iOS 8下有很多错误,所以在大多数情况下它只能使用从 iOS 9.
开始
虽然有很多关于这个主题的讨论,但我仍然没有找到答案。
问题是,UIWebView加载一个页面后,永远不会释放所有使用的内存资源。
我创建了一个空项目。刚刚添加了 UIWebView。加载请求前使用的内存 (http://methodhome.com/cleanhappy) 为 4.5MB,加载完成后 - 70 ~ 90 MB。
释放UIWebView后,使用的内存还是55MB
所以看起来有大约 50MB 的内存泄漏。
我尝试了以下方法:
[_webView stringByEvaluatingJavaScriptFromString:@"var body=document.getElementsByTagName('body')[0];body.style.backgroundColor=(body.style.backgroundColor=='')?'white':'';"];
[_webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML='';"];
[_webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"];
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
[_webView loadHTMLString:@"" baseURL:nil];
[_webView stopLoading];
_webView.delegate = nil;
[_webView removeFromSuperview];
_webView = nil;
[[NSURLCache sharedURLCache] removeAllCachedResponses];
我也试过设置:
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
并玩过内存和磁盘的缓存设置。 没有任何帮助。
这怎么可能?流行的浏览器是如何像 Safari 和 Chrome 那样工作的呢?释放那些资源的技巧是什么?
How can it be possible?
UIWebView
是旧的 API,基于 WebKitLegacy。它没有因为 1 个单一原因而被弃用 - Apple 没有替代品(直到 iOS 9)。
How are the popular browsers are working like Safari and Chrome with such a leaks.
Safari 是一个浏览器,由Apple 自己创建。它可以使用任何 hack 和私人 APIs,在 AppStore 中受到限制。实际上,目前 Safari 的行为非常接近 WKWebView
的行为。但它从未与 UIWebView
.
最近 Google Chrome 才能够迁移到 WKWebView
。有关详细信息,请参阅 https://bugs.chromium.org/p/chromium/issues/detail?id=423444。在此之前,Google Chrome 也面临同样的问题。
What is the trick to release those resources?
我尝试了很多技巧,但 none 对我有用。不幸的是,唯一的解决方案是迁移到WKWebView
,在iOS 8中引入。此外,WKWebView
在iOS 8下有很多错误,所以在大多数情况下它只能使用从 iOS 9.