Chesterlee's Zen

Follow your heart and intuition

谈谈在UIWebView中的内存控制

本文是一个webView内存管理的trick,可以直接拿来用。
由于UIWebView的内容加载不受程序员直接控制,所以在UIWebView加载一些图片较多的网页时,如果图片较多,很容易就在网页读取阶段出现memory warning,而且当你把webview对象干掉时,内存依然不减。如果不处理的话,程序就会被kill掉。如何处理呢,下面是几个tip可以让君尝试:

1、在每一次UIWebView读取页面结束后(Delegate),调用UserDefault关闭缓存。代码:

   - (void)webViewDidFinishLoad:(UIWebView *)webView 
   {
     [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];  
   } 

注意,不必担心这个WebKitCacheModelPreferenceKey会一直保持为0。因为每一次UIWebView加载页面的时候,都会把此值设置为1。

2、在离开webview的controller时,使用WebView加载nil的URL,并清理webview。

-(void)viewDidDisappear:(BOOL)animated
{
  [super viewDidDisappear:animated];
  [self.webView loadRequest:nil];
  [self.webView removeFromSuperview];
  self.webView = nil;
  self.webView.delegate = nil;
  [self.webView stopLoading];
} 

3、在收到系统警告的时候,清理NSURLCache的CachedResponse。

-(void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];
  [self.navigationController setNavigationBarHidden:NO];
} 

trick结束:)。
本文参考:
1、Reduce iOS memory utilization by taming NSURLCache
2、UIWebView Memory Leak Prevention
3、UIWebView Secrets – Part1 – Memory Leaks on Xmlhttprequest

Comments