UIWebView占用大量内存

时间:2014-03-31 18:52:09

标签: ios objective-c ipad uiwebview automatic-ref-counting

在我的应用程序中,当我用任何网站URL加载UIWebView时,内存从30mb跳到140mb左右。 我正在使用ARC

here is the image for the same
当解雇包含UIWebView的UIWebViewController [Viewcontroller]时,它不会释放内存。 任何机构都可以帮助我解决这些内存问题,并请在ARC

中提供内存最佳实践的指示

加载网页: -

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

解雇Viewcontroller: -

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

提前致谢:)

9 个答案:

答案 0 :(得分:6)

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

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

[[NSURLCache sharedURLCache] removeAllCachedResponses];

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

如果仍有问题,请尝试通过调用

来限制内存缓存大小
[[NSURLCache sharedURLCache] setMemoryCapacity:size]
祝你好运!

答案 1 :(得分:3)

不要听他们,

这不是问题,手机可以处理所有内存使用情况,尝试使用MKMapView并观察你的内存使用率飙升。

在你的模拟器中,尝试通过低内存警告cmd+shift+m,看看会发生什么,你不能指望所有的网页浏览量都以相同的内存使用率运行,而且,你有机会为你的电话缓冲它。

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

但是无论如何都要试试这个:

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

答案 2 :(得分:2)

  • 使用“工具分配”选项卡查看内存中UIWebViewController的实例数。 (在Xcode中使用Cmd + I,让Instruments打开,选择Allocations,然后在搜索栏中输入UIWebViewController)
  • 如果超出您的预期,请留意保留周期。
  • 尝试在块中使用弱引用而不是self。
  • 确保您没有对UIWebViewController对象进行强有力的引用 不止一个地方。
  • 在viewController的dealloc方法中放置一个断点/ NSLog,看它是否被调用。

答案 3 :(得分:2)

在确定存在问题之前,没有必要搜索问题。

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

1.UIWebView未被取消分配。

2.它是一些系统缓存或某些特定的iOS内存处理算法。

在第二种情况下,你无能为力。要检查第一种情况,您可以尝试使用仪器或只是子类UIWebView并将记录添加到dealloc方法。

@implementation MyUIWebView

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

@end

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

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

答案 4 :(得分:1)

添加

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

在此行之前

[self dismissViewControllerAnimated:YES completion...]
没有你的webView应该由ARC负责。不要在完成块中引用Web视图。

答案 5 :(得分:1)

我想您忘记从视图层次结构中删除UIWebView。这将导致额外的保留计数,并防止在您将财产取出时回收内存。

答案 6 :(得分:1)

你应该检查一些事情:

  • 控制器对其strong具有view引用,只要您将其保留在视图层次结构中,此视图就会保留所有子视图,因此任何其他属性都应为weak ,包括您的webView财产。
  • 使用ARC时,不需要“nil”所有内容。 ARC会自动nil strong deallocweak个引用。
  • 无需对weak引用执行任何操作。此外,在iOS 5+ nil上,如果引用的对象在其他地方被释放,则引用会自动变为view

我认为你的整个视图控制器很可能会被保留在某个地方,从而保留webViewweak

确保您只保留{{1}}对控制器的引用,并让它由容器或呈现控制器保留,以便在它被弹出或解除时自动释放。

答案 7 :(得分:1)

我的申请中遇到了同样的问题。我建议你应该使用WKWebView。 WKWebView是在iOS 8中引入的。 你可以在这里读更多关于它的内容 apple documentation

内存问题肯定已经解决了。您将从webview获得所有功能以及更多功能(即进度)。希望这有帮助

答案 8 :(得分:0)

如果您想立即减少UIWerview的内存使用量,可以尝试:

1

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

2

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

3

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

对我有用。