UIWebView内存泄漏

时间:2012-01-20 19:06:25

标签: ios memory-leaks uiwebview

我有一个iPad应用程序(IOS 4.3& 5.0),每次用户向前或向后翻页时都会创建一个至少有2个子视图的UIView。 2个子视图是UIWebView对象。

在每次相关的滑动中,旧的UIWebViews被删除并正确释放(removeFromSuperview然后stopLoading并将委托设置为nil)并且取消分配父UIView。我可以确认父UIView和2个子UIWebViews都已完全消失了。

我可以看到webview上的保留计数,因为它们被删除了,我很确定它们每次都被删除了。 然而,我的内存分配在每次刷卡时继续增加~200-350k。仪器没有泄漏,但我可以看到内存使用量缓慢上升。 在iPad 1上,应用程序最终(在适度使用的6-10分钟内)收到多个内存警告并终止。生成LowMemory崩溃日志...等。

我们使用stringByEvaluatingJavaScriptFromString和loadRequest来填充Web视图。即使没有注入任何内容或将其加载到webViews中,内存使用也会增加。

是否有人在使用UIWebViews时遇到过这种行为?有没有人成功处理过这个问题?

虽然,评论&答案将不胜感激。

3 个答案:

答案 0 :(得分:1)

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

  1. 配置文件应用分配模板
  2. 通过所有标签“滚动”应用程序,滚动等等。
  3. 按“Mark Heap”,这将创建“基线”快照
  4. 做你认为导致物体留下的东西
  5. 再次按“Mark Heap”,这将创建一个“Heapshop#”heapshot
  6. 检查“Heapshop#”中的对象,这些对象将显示自上次快照以来创建和活动的对象的大小和数量。
  7. 转到4

答案 1 :(得分:0)

不知道有任何泄漏,但如果您每次滑动都在销毁并重新创建相同的视图层次结构,为什么不存储视图并重新使用它们呢?

无论它们是否泄漏,webview的设置成本都很高,因此重新使用它们只是重新加载内容应该可以提高性能,并且可以解决您的泄漏问题。

答案 2 :(得分:0)

你仍然看到这个问题吗?我通过一遍又一遍地调用stringByEvaluatingJavaScriptFromString来跟踪看起来像无限内存使用的东西(不一定是泄漏,但我得到低内存警告和最终进程终止):

[webview stringByEvaluatingJavaScriptFromString:@"something()"];

似乎有些奇怪的东西。