UIWebView占用大量内存

在我的应用程序,当我加载任何网站URL的UIWebView的内存从30MB跳跃到大约140MB。 我正在使用ARC

这里是相同的图像
当解除UIWebViewController [包含UIWebView的Viewcontroller ]时,它不释放内存。 任何机构可以帮助我如何解决这个内存问题,也请给我提供一些ARC内存最佳实践的指针

加载网页: –

 NSURL *nsurl=[NSURL URLWithString:self.url]; NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl]; [webview loadRequest:nsrequest]; 

closures视图控制器: –

 [self dismissViewControllerAnimated:YES completion:^{ webview.delegate=nil; webview=nil; }]; 

提前致谢 :)

哇,今天我们也遇到了这个问题。 当我们尝试加载包含大量图片或巨大网页的网页时,很容易崩溃。 我们也发现使用了近200M的内存。

最后我们发现我们可以删除Web视图的内存caching

 [[NSURLCache sharedURLCache] removeAllCachedResponses]; 

当您收到内存警告时,您可以尝试它。 或者你可以在dealloc方法中调用它。

如果仍有问题,请尝试通过调用来限制内存caching大小

 [[NSURLCache sharedURLCache] setMemoryCapacity:size] 

祝你好运!

不要听他们,

它不是一个问题,手机可以处理所有的内存使用情况,尝试使用MKMapView,并观看你的内存使用量飙升。

在你的模拟器中,尝试通过一个低内存警告cmd+shift+m ,看看会发生什么,你不能指望所有的networking视图在相同的内存使用情况下运行,同样,你有机会让你的手机缓冲这一切都出来了。

iPhone可以处理所有这些,所以你不必太担心。

但无论如何请试试这个:

如果在nib文件中取消选中“检测链接”,则UIWebViews的行为会发生变化,所以请尝试切换,看看会发生什么。

  • 使用“工具分配”选项卡查看您的UIWebViewController实例在内存中的实例数量。 (Xcode中的Cmd + I,让Instruments打开,selectAllocations,然后在search栏中inputUIWebViewController)
  • 如果你所期望的不止于此,可以留意一个保留周期。
  • 尝试在块中使用弱引用而不是自我。
  • 确保你没有在多个地方持有对UIWebViewController对象的强引用。
  • 在你的viewController的dealloc方法中放置一个断点/ NSLog,看它是否被调用。

在确定问题存在之前,找不到问题是没有意义的。

内存使用率如此之高有两种可能性:

1.UIWebView不会被释放。

2.是一些系统caching或一些特定的iOS内存处理algorithm。

在第二种情况下,你什么都不能做。 要检查第一种情况,您可以尝试使用仪器或只是子类UIWebView,并将日志logging添加到dealloc方法。

 @implementation MyUIWebView - (void)dealloc { NSLog(@"MyUIWebView deallocated!"); } @end 

不要忘记在代码中将UIWebView更改为MyUIWebView。

只有当你确定UIWebView没有被释放,你应该开始search强指针,保留圈子等等。

 if (webView.isLoading){ webView.stopLoading; } webView.delegate=nil; 

在这一行之前

 [self dismissViewControllerAnimated:YES completion...] 

没有你的webView应该由ARC照顾。 不要在完成块中引用Web视图。

我想你忘了从视图层次中删除UIWebView。 这会导致额外的保留计数,并防止在您清空该属性时回收内存。

只是应该检查一些事情:

  • 控制器对其viewstrong参考,只要你把它们放在视图层次结构中,这个视图就会保留所有的子视图,所以任何附加的属性都应该是weak ,包括你的webView属性。
  • 使用ARC时,不需要“ nil ”。 ARC将在dealloc自动dealloc所有strong引用。
  • 不需要用weak引用做任何事情。 此外,在iOS 5+中,如果被引用的对象在其他地方被释放, weak引用将自动变为nil

我认为最有可能你的整个视图控制器被保留在某个地方,从而它的viewwebView

确保你只保留对控制器的weak引用,并让它由一个容器或呈现控制器保留,所以只要它被popup或解散就会自动释放。

我的应用程序中遇到同样的问题。 我会build议你应该使用WKWebView。 WKWebView是在iOS 8中引入的。你可以在这里阅读更多有关苹果文档

记忆问题是绝对解决的。 你将从webview中获得所有的function和更多(即进展)。 希望这可以帮助

如果要立即减lessUIWerview的内存使用量,可以尝试:

1。

 [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 

要么

2。

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

要么

3。

 [webview loadData:nil MIMEType:nil textEncodingName:nil baseURL:nil]; 

它对我有用。