【问题标题】:UIWebView with dynamic height leads to memory crash具有动态高度的 UIWebView 导致内存崩溃
【发布时间】:2015-04-24 18:14:43
【问题描述】:

我有一个带有 UITableView 的原生 iOS 屏幕,其中显示了一些文章。此表中的某些单元格显示文章图像、标题、作者、cmets 等。但有一个单元格内部带有UIWebView,显示文章内容。此单元格具有取决于内容大小的动态高度。文章内容以 JSON 响应中的 html 字符串形式从服务器传出,可能包含支持 HTML 格式的图像、视频和其他内容。我可以根据某些要求使用正则表达式编辑此字符串(例如,根据应用设置增加字体大小)。这是代表我的 UI 结构的图像:

问题是一旦文章内容非常大,UITableView 单元格和UIWebView 内部的高度也会变得非常大,这会导致内存崩溃。就我而言,这种崩溃只发生在 iPhone 6 Plus 上。在包括 iPhone(5、5S、6)、iPad(2、3、4)(可能还有其他支持 iOS 7 的设备)在内的所有其他设备上,应用程序都可以正常工作。我怀疑原因是 iPhone 6 Plus 具有高分辨率屏幕和只有 1 Gb 的内存。因此,使用与其他设备相同的内存量但以更大的分辨率渲染相同的内容会导致内存崩溃。

我创建了两个带有 UI 的测试应用程序,如下图所示:

两个应用都在一个 UIWebView 中加载相同的 HTML 内容。两个应用程序中都没有其他用户界面或逻辑。

如果 a) 一切正常,滚动指示器出现并且只呈现可见内容。当我快速滚动时,我可以看到稍后会被渲染内容替换的空白。

如果 b) UIWebView 拉伸以适应内容大小。测试应用程序崩溃(作为我的真实应用程序)。正如我所怀疑的那样,在这种情况下,甚至会呈现不可见的内容,这会导致内存崩溃。

所以我的问题是: 如何在不滚动 UIWebView 的情况下修复此错误?只有UITableView 应该是可滚动的

【问题讨论】:

  • 你有想过这个吗?我遇到了同样的问题。
  • 我也面临这个问题。你解决了吗?谢谢。
  • 我通过限制网络视图单元格的最大高度解决了这个问题。如果 web 视图单元格高度超过一定数量的像素,我不会增加其高度,而是显示“显示更多...”按钮。当用户点击此按钮时,将呈现全屏 UIWebView,而无需额外的 UI 元素,并且用户只能滚动 UIWebView 内容。我不喜欢这个解决方案,但这是我找到的唯一解决方案。就我而言,这已得到客户的认可。

标签: ios iphone ipad memory uiwebview


【解决方案1】:

让你的 UITableViewCell 可重用。即(UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];)。 一件非常重要的事情不要使用[UIimage imagenamed:@"Imagename.jpg"],这会导致内存崩溃,您可以使用[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Imagename" ofType:@"png"]];。 我希望它可能会有所帮助。

【讨论】:

  • 不幸的是,这不起作用。我的UITableViewCells 已经可以重复使用了。我的测试应用程序也崩溃了。它没有任何UIImages 和UITableView。只有一个UIWebView
  • 那么图片加载呢?
  • 编辑了我之前的评论,回答了关于图片的问题
【解决方案2】:

你可以给 webview 恒定的高度。它里面有滚动查看器。否则很难一次渲染大量内容。如果你给 webview 常量大小(最大值)空白也会被删除。

编辑:webviews 自己的滚动视图应该可以与 tableviews 滚动视图正常工作,但我不确定

【讨论】:

  • 我已经试过了。在这种情况下,UIWebView 与包含UITableView 分开滚动。我需要这个屏幕的单个滚动,而不是另一个滚动视图中的滚动视图
  • 我的 Mac 不在附近。你可以试试 iphone 6+ 的 WKWebView。它仅支持 ios8+,但 iphone6 也仅适用于 ios8+。也许可以提供更好的性能。
  • 我刚刚尝试过这种方法,但不幸的是结果是一样的 - 应用程序崩溃并带有非常大的 html 内容
  • 在这种情况下,如果没有任何其他解决方案,您可以尝试找到一种使用 2 个滚动视图的方法。它看起来像是内存管理的某些解决方案。祝你好运!
  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2014-11-22
  • 2016-02-21
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 2010-09-25
  • 2011-03-29
  • 2011-07-24
相关资源
最近更新 更多