自动释放会隐藏 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 中的泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章