iOS 8 UIWebView内存管理



我有一个分层应用程序(NavigationController),它具有一个简单的表视图,作为根控制器。每次选择任何单元格时,都会得到一个新的视图,其中包含一些有关详细信息(由DetailViewController管理)。在DetailViewController视图的一侧,我有一个UIWebView来显示来自Internet的数据。但当我观察内存使用情况时,问题就出现了。DetailViewController的每个新打开的视图及其通过UiWebView从web加载的内容都会使用系数带来更多内存。当我回到根控制器的视图时,我想卸载所有内容并释放为这些数据分配的内存。

我该如何处理这个问题?我尝试使用stopLoading: UIWebView的实例方法来节省一些内存,但它也不能解决问题。除了我不完全理解ARC的工作过程外,我也不能确保自己在正常情况下,每打开一个新的细节视图,都会增加使用系数的内存。

提前谢谢!

需要注意的几点。UIWebView"泄漏"。至少从iOS4开始,它就一直在泄漏。随着每一次大的页面加载,它似乎都在增长,并且在释放UIWebView对象本身时,内存并没有得到完全补充。无论这些内存是否保留在缓存中,并在真正需要时释放,还是泄漏,我都无法正确回答。这些年来,这种情况有所改善,但使用Instruments的内存分配图仍然可以看到。

让我们从基础开始。在你开始改变你的设计之前,试着用仪器看看到底是什么泄漏了。您还可以对视图和视图控制器进行子类化,实现它们的解除锁定方法,并确保它们在预期的时候被正确释放。很多时候,尤其是当涉及到块时,人们会创建保留循环,从而导致巨大的内存泄漏。先做这个。

以下是我使用WebKit的经验中的一些建议:

  • 尽可能重复使用web视图。如果可以的话,使用相同的对象,并将其添加为视图控制器视图的子视图
  • 我们注意到,在释放UIWebView对象之前,我们能从web视图中消耗的最多的东西就是打开一个空白页面
  • iOS8支持使用WebKit的新模型:WKWebView(WebKit2)。在这个模型中,web内容是在管理和提取过程中产生的,而内存在这个过程中会"泄漏"。当需要时,操作系统会终止这些WebKit进程,从而允许您的应用程序运行。你可以试试这个,看看你是否有改进

最新更新