UIWebView的内存泄露
UIWebView的内存泄露问题相当让人头疼,因为这个问题,根据手头上能够查找到的资料,源自于apple,早在08年的时候就被IOS开发者 发现,直到现在11年,仍然没有得到解决。有文章分析并实验过,指出是UIWebView在发送XMLHttpRequest时会导致泄露出现。
我搜集了一下在stackoverflow里提到的各种提出的所谓‘解决’方法。
1. 据说源于WebKitCacheModelPreferenceKey,由于有缓存的存在,所以导致了泄露,而在页面每次打开并加载后,这个值将会被自动设为1,所以这个方法是要在webView加载完成后,把缓存关掉,以防止出现泄露。本人试过,失败。。
- - (void)webViewDidFinishLoad:(UIWebView *)webView {
- [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
- }
UIWebView rotation and memory problem – Stack Overflow.
该方法的出处
2. 这个方法用在webView被释放的时候,也就是dealloc的时候,据说加载一个空链接,能够把泄露清除掉。。嗯,测试过,也没有成功。
- [webView loadHTMLString:nil baseURL:nil];
3.最后尝试的方法,是ASIWebPageRequest。它的原理,基于这么一个事实,UIWebView加载本地html文件以显示web内
容,不会发生内存泄露。也就是说,ASIWebPageRequest是通过ASIHttpRequest的异步下载机制,把web上所有,包括css,
js, 图片,多媒体等内容全部下载到本地cache中,然后再读取cache内容并渲染到webView中。
然后在实际使用后,结果是泄露依然存在。也许导致泄露的可能性降低了,但按照 #1
中文章的测试,只要web会发出异步的XMLHttpRequest,那么,泄露就是必然的了。。而且,这个控件还可能会导致链接不能访问情况,也许是异
步通信的方式对web的异步加载依然没有很好的解决方案。Anyway,这个插件仍然处于experiment状态,也许日后能够完善吧。
所以,归根结底,UIWebView的泄露,估计在IOS5之前都解决不了了。而IOS5由于据说提供了完成的GC机制,希望这个麻烦的问题,能够被一并解决掉吧。
原文地址:http://blog.cielyann.com/2011/07/28/uiwebview%E7%9A%84%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2