【问题标题】:Does autorelease hide leaks in Instruments?自动释放会隐藏 Instruments 中的泄漏吗?
【发布时间】:2012-01-19 14:28:38
【问题描述】:

这是一个似乎可以欺骗 Leaks 的场景:

  1. 从 Nib 或使用 alloc/init 生成 UIView *v。
  2. 分配、初始化和自动释放更多视图,例如UIButton,并将它们作为子视图附加到 UIView。
  3. 释放视图 v.

就是这样。子视图没有发布,但 Leaks 也不会看到它们。

还有其他人看过吗?

注意:解决这个问题的方法是从超级视图中删除任何附加到 v 的东西。

谢谢。

【问题讨论】:

    标签: objective-c ios memory-leaks


    【解决方案1】:

    是什么让你认为它们没有被释放?

    听起来您的保留和释放是平衡的,因此应该正确释放它们。您可能会感到困惑的是,因为它们是自动释放的,所以它们不会立即释放,而是会在自动释放池刷新时在 1/60 秒后释放。

    如果它有助于澄清事情:视图在添加时会自动保留子视图,并在它们自己释放时释放它们(就像将项目添加到数组中一样)。

    【讨论】:

    • 子视图最终会被释放,但这需要很长时间,并且在此之前会发生内存警告。
    • 是的,就像一个数组。事实上subviews 是一个数组。您不会将NSString 添加到NSMutableArray 然后调用autorelease 您只需调用release
    • 我想我的问题是它们没有足够快地发布,以至于该版本在防止内存警告方面很有用。不知道为什么会这样。因此我的解决方案是,创建子视图,将它们添加到 v,然后释放它们而不是自动释放。
    • 什么,等等。如果您收到内存警告,则说明您做错了什么。你能告诉我们你是如何实例化视图的吗?
    【解决方案2】:

    您需要阅读memory guidelines

    您已经通过自动释放您创建的 UIView 完成了您的内存管理工作,并且您已将它们的所有权转移到 UIView v。

    编辑

    在阅读了您的 cmets 之后,似乎它们实际上并没有被释放,这可能是循环引用。您确定没有其他东西保留该视图吗?你是如何实例化它们的?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多