2012-01-20 61 views
4

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

在每个相关的滑动操作中,旧的UIWebView会被正确地移除和释放(removeFromSuperview然后stopLoading并将委托设置为nil),并且释放父UIView。我可以确认父UIView和2个子UIWebViews都完全没有了。

我可以在网页浏览中看到保留数,因为它们被删除,我确信它们确实每次都被删除。 但是,我的内存分配在每次刷卡时会继续增加〜200-350k。仪器没有泄漏,但我可以看到内存使用量缓慢上升。 在iPad 1上,应用程序最终(在中等使用情况下6-10分钟内)会收到多个内存警告并终止。 LowMemory崩溃日志等等。

我们使用stringByEvaluatingJavaScriptFromString和loadRequest来填充Webviews。即使没有任何内容被注入或加载到webView中,内存使用量也会增加。

是否有人用UIWebViews体验这种行为?有没有人处理过这个成功?

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

+0

你正在从超级视图中删除,停止加载,并将委托设置为零,但你确定*你没有额外的保留在这些网页浏览?可能你没有考虑'@property(nonatomic,retain)'? – Tim

+0

嗨,你有没有碰运气? –

+1

循环参考。我的意见之一仍然挂在控制器上。毕竟经典的记忆体非常经典,但在大型代码库中很难处理。 – smaura777

回答

0

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

无论他们是否泄漏,webviews的设置在计算上都很昂贵,因此重新使用它们并重新加载内容应该会提升性能,并且可能会解决泄漏问题。

+0

这不是一个真正的选择,是的,我做到了这一点,内存分配仍然在每次滑动上升 – smaura777

+0

http://stackoverflow.com/a/5056158/990618 –

1

尝试使用仪器,但使用“分配”模板并观看UIWebView的“#Living”列。我通常使用这样的:与分配模板

  1. 档案应用
  2. 前往通所有选项卡“警告了”应用程序,滚动浏览等
  3. 按“马克堆”,这将创建一个“基线” heapshot
  4. 你认为原因对象呆在身边
  5. 按“马克堆”了,这将创建一个“Heapshop#”的东西heapshot
  6. 检查在“Heapshop#”,这将显示对象大小和创建的对象的数量自上次堆积后活着。
  7. 转到4
+0

我一直在做这个过去一周,它是很明显,即使在webview发布之后,webviews中的某些内容仍然存在。一旦我禁用了所有的网页浏览器,问题几乎消失了。 – smaura777

+0

好的,你会发现#生活中不断有很多物体在上升? –

0

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

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

好像有一些奇怪的存在。

+0

我正在使用这种方法,我也看到了。不幸的是,我不能用其他东西来代替它。 – smaura777