我有一个分层应用程序(NavigationController),在根控制器的角色中有一个简单的表视图.每次选择任何单元格时,都会有一个新视图,其中包含有关详细信息的一些信息(由DetailViewController管理).在DetailViewController的视图一侧,我有一个UIWebView来显示来自Internet的数据.但是当我查看内存使用情况时会发生问题. DetailViewController的每个新打开视图及其内容通过UiWebView从Web加载,使用系数带来更多内存.当我回到根控制器的视图时,我想卸载所有内容并释放为该数据分配的内存.
我该如何管理这个问题?我试图stopLoading:UIWebView的实例方法来保存一些内存,但它也没有解决问题.除了我不完全理解ARC的工作过程,我无法确保自己是否通常使用每个新打开的详细信息视图的系数增加内存.
先感谢您!
解决方法
有几点需要注意. UIWebView“泄漏”.它至少从iOS4开始泄漏.随着每个大页面加载,它似乎增长,并且当UIWebView对象本身被释放时,内存不会完全正确地补充.无论这个内存是保留在缓存中还是在真正需要时释放,或者是泄漏,我都无法正确回答.多年来,这有所改善,但仍可以使用Instruments的内存分配图表看到.
让我们从基础开始吧.在开始更改设计之前,请尝试使用Instruments查看究竟是什么泄漏.您还可以对视图和视图控制器进行子类化,实现其dealloc方法,并确保在预期时正确释放它们.很多时候,特别是当涉及块时,人们会创建保留周期,这会导致巨大的内存泄漏.首先这样做.
以下是我使用WebKit时的一些建议:
>尽可能重用Web视图.如果可以,请使用相同的对象,并将其添加为视图控制器视图的子视图.>我们注意到,从Web视图中流失的最多是在释放UIWebView对象之前打开一个空白页面.> iOS8支持使用WebKit的新模型:WKWebView(WebKit2).在此模型中,Web内容被管理并从进程中抽出,并且内存在该进程中“泄露”.在需要时,操作系统将终止这些WebKit进程,从而允许您的应用程序运行.你可以尝试这个,看看你是否有改进.