iOS 8 UIWebView 内存管理

标签 ios memory uiwebview

我有一个分层应用程序 (NavigationController),它具有一个简单的表格 View ,充当根 Controller 的角色。每次选择任何单元格时,您都会获得一个新 View ,其中包含一些有关详细信息的信息(由 DetailViewController 管理)。在 DetailViewController 的 View 一侧,我有一个 UIWebView 来显示来自 Internet 的数据。但是当我查看内存使用情况时会出现问题。每个新打开的 DetailViewController View 及其通过 UiWebView 从网络加载的内容都会带来更多的内存使用系数。当我回到根 Controller 的 View 时,我想卸载所有内容并释放分配给该数据的内存。

我该如何处理这个问题?我尝试通过stopLoading: UIWebView的实例方法来节省一些内存,但也没有解决问题。除了我不完全了解 ARC 的工作过程外,我无法确定是否通常会在每个新打开的详细 View 中使用系数来增加内存。

提前致谢!

最佳答案

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

让我们从基础开始。在您开始更改您的设计之前,请尝试使用 Instruments 来查看究竟是什么泄漏了。您还可以子类化您的 View 和 View Controller ,实现它们的 dealloc 方法并确保它们在预期时正确释放。很多时候,尤其是当涉及到 block 时,人们会创建保留循环,这会导致巨大的内存泄漏。先做这个。

根据我使用 WebKit 的经验,这里有一些建议:

  • 尽可能重复使用 WebView 。如果可以,请使用相同的对象并将其添加为 View Controller View 的 subview 。
  • 我们注意到,在释放 UIWebView 对象之前,我们最多只能从 Web View 中打开一个空白页面。
  • iOS8 支持使用 WebKit 的新模型:WKWebView (WebKit2)。在这个模型中,Web 内容是在进程外管理和提取的,内存在该进程中“泄漏”。需要时,操作系统会终止这些 WebKit 进程,从而让您的应用程序运行。您可以尝试一下,看看是否有改进。

关于iOS 8 UIWebView 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26074055/

相关文章:

objective-c - 如何仅从核心数据中获取前 20 个对象

memory - 在游戏中寻找特定的内存位置?

javascript - 我如何在 webgl 中使用 stride?

iphone - UIwebView链接延迟

ios - 从日期字符串开始的 24 小时时间

ios - 计算 N 像素中的空格数 ' '

ios - AudioKit 录音机设置与麦克风崩溃 "required condition is false: mixingDest"

c++ - 本地 CGEventRef 是否被视为指针?

ios - SWIFT - 加载本地 CSS 文件

javascript - 调用iOS应用程序中嵌入的Javascript