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。 这会导致额外的保留计数,并防止在您清空该属性时回收内存。
只是应该检查一些事情:
- 控制器对其
view
有strong
参考,只要你把它们放在视图层次结构中,这个视图就会保留所有的子视图,所以任何附加的属性都应该是weak
,包括你的webView
属性。 - 使用ARC时,不需要“
nil
”。 ARC将在dealloc
自动dealloc
所有strong
引用。 - 不需要用
weak
引用做任何事情。 此外,在iOS 5+中,如果被引用的对象在其他地方被释放,weak
引用将自动变为nil
。
我认为最有可能你的整个视图控制器被保留在某个地方,从而它的view
和webView
。
确保你只保留对控制器的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];
它对我有用。