UIWebView内存泄漏问题

4
我有一个iPad应用程序(IOS 4.3和5.0),每次用户向前或向后翻页时,它都会创建一个UIView,并至少包含2个子视图。这2个子视图是UIWebView对象。
在每次相关的滑动中,旧的UIWebViews被正确地删除和释放(removeFromSuperview然后stopLoading并将delegate设置为nil),并且父UIView也被释放。我可以确认父UIView和2个子UIWebViews都已经消失了。
我可以看到webviews的保留计数器在它们被删除时,我非常确定它们确实每次都被删除了。 然而,我的内存分配在每次翻页时仍然继续增加约200-350k。在工具中没有泄漏,但我可以看到内存使用量缓慢上升。 在iPad 1上,该应用程序最终(在适度使用6-10分钟内)接收到多个内存警告并终止。生成LowMemory崩溃日志等。
我们使用stringByEvaluatingJavaScriptFromString和loadRequest来填充Webviews。即使没有将任何内容注入或加载到webViews中,内存使用量也会逐渐增加。
是否有人遇到过这种UIWebViews行为?有人成功处理过吗?
非常感谢您的想法、评论和答案。

你正在将视图从父视图中移除,停止加载,并将委托设置为nil,但你确定这些webview上没有额外的保留吗?可能你没有考虑到@property (nonatomic, retain)吗? - Tim
嗨,你有没有在解决这个问题上有什么好运? - Dan Abramov
1
循环引用。我的一个视图仍然依附于一个控制器上。毕竟这是相当经典的内存问题,但在大型代码库中处理起来很棘手。 - smaura777
3个回答

1

尝试使用Instruments,但使用“Allocations”模板并观察UIWebView的“#Living”列。我通常是这样使用它的:

  1. 使用Allocations模板对应用程序进行配置
  2. 通过所有选项卡,滚动等“预热”应用程序。
  3. 按“标记堆”,这将创建一个“基线”堆快照
  4. 执行您认为会导致对象保留的操作
  5. 再次按“标记堆”,这将创建一个“Heapshop#”堆快照
  6. 检查“Heapshop#”中的对象,其中将显示自上次堆快照以来创建和存活的对象的大小和数量。
  7. 转到第4步

我已经这样做了一个星期,很明显在释放webview后仍然有一些东西挂起来了。一旦我禁用了所有的webview,问题基本上就解决了。 - smaura777
好的,你看到很多对象的 #living 不断上升了吗? - Mattias Wadman

0

我不知道是否存在泄漏问题,但如果您在每次滑动时都销毁并重新创建相同的视图层次结构,为什么不存储这些视图并重复使用呢?

无论它们是否泄漏,Web视图在设置上的计算成本都很高,因此重复使用它们并只重新加载内容应该会提高性能,并可能解决您的泄漏问题。


这里实际上并不是一个选项,而且是的,我最初就已经做到了,但是每次滑动时内存分配仍然会增加。 - smaura777

0
你还看到这个问题吗?我追踪了一些看起来像是无限内存使用的东西(不一定是泄漏,但我会收到低内存警告和最终进程终止),通过一遍又一遍地调用stringByEvaluatingJavaScriptFromString方法。
[webview stringByEvaluatingJavaScriptFromString:@"something()"];

看起来那里有些奇怪。


我经常使用那个方法,也发现这个问题。不幸的是,我无法用其他东西来替代它。 - smaura777

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接