自动释放会隐藏 Instruments 中的泄漏吗?

Posted

技术标签:

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

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

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

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

还有其他人看过吗?

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

谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

您需要阅读memory guidelines。

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

编辑

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

【讨论】:

以上是关于自动释放会隐藏 Instruments 中的泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

自动释放的 NSArray 会导致内存泄漏吗?

内存泄漏 Instruments Leak使用

ARC CCSprite 内存泄漏

C 会自动释放应用于函数的函数吗?

Objective-C:内存泄漏与自动释放的多重分配?

从 Instruments 读取内存分配结果