2014-09-27 102 views
6

我有一个层次结构的应用程序(NavigationController),它具有根控制器角色中的简单表视图。每次选择任何单元格时,都会得到一个新的视图,其中包含有关细节的一些信息(由DetailViewController管理)。在DetailViewController的视图方面,我有一个UIWebView来显示来自Internet的数据。但是当我查看内存使用情况时会发生问题。 DetailViewController的每个新打开的视图以及通过UiWebView从Web上加载的内容带来更多的内存使用系数。当我回到根控制器的视图时,我想卸载所有内容并释放为该数据分配的内存。iOS 8 UIWebView内存管理

如何管理该问题?我试图stopLoading: UIWebView的实例方法来保存一些内存,但它也不能解决问题。除了我没有完全理解ARC的工作过程外,如果通常每个新打开的详细视图都使用系数增加内存,我无法保证自己。

预先感谢您!

回答

9

有几件事要注意。 UIWebView“泄漏”。至少iOS4以来一直在泄漏。随着每个大页面的加载,它似乎会增长,并且在发布对象本身时,内存不会完全正确补充。无论这种内存是否保留在缓存中并在真正需要时释放,或泄漏,我都无法正确回答。多年来这已经有所改善,但仍然可以使用仪器的内存分配图来看。

让我们从基础开始。在开始对设计进行更改之前,请尝试使用“乐器”来查看究竟是什么泄漏。您也可以继承您的视图和视图控制器,实现它们的dealloc方法,并确保它们在预期的情况下被正确释放。很多时候,特别是涉及块时,人们会创建保留周期,这会导致巨大的内存泄漏。先做这件事。

下面是我的经验与WebKit的工作了几个建议:

  • 重用Web视图尽可能。如果可以,请使用相同的对象,并将其添加为视图控制器视图的子视图。
  • 我们注意到,我们可以从网页视图中排除的最多是在释放UIWebView对象之前打开一个空白页面。
  • iOS8支持使用WebKit的新模型:WKWebView(WebKit2)。在这个模型中,网络内容被管理和撤销,并且在这个过程中内存被“泄漏”。需要时,操作系统将终止这些WebKit进程,从而允许您的应用运行。你可以试试看看你是否有改进。