自动释放和保留的使用

Posted

技术标签:

【中文标题】自动释放和保留的使用【英文标题】:Usage of autorelease and retain 【发布时间】:2012-07-13 19:33:08 【问题描述】:

我有一个简单的问题。保留计数高时自动释放是否有效?

例如...如果我在视图控制器中并执行以下操作:

[self retain];
[self retain];
[self retain];
[self retain];
[self autorelease];

如果我弹出视图,它会被释放吗?

谢谢。

【问题讨论】:

自动发布只是一个“延迟发布”;它相当于释放在稍后的某个未指定的时间被调用。所以它只会平衡一个保留。 无论如何,autorelease不是一个无论如何都会删除你的对象的神奇方法;保留计数必须平衡。或者更好:明确对象所有权并进行相应管理。 【参考方案1】:

自动释放只是将对象添加到自动释放池中。当自动释放池被释放时,释放消息被发送到对象,以及该池中的所有其他对象。如果您的保留计数仍然大于零并且您没有进一步释放,那么您将有内存泄漏。

我相信,如果您按照上面所说的那样做,您的保留计数将为 5(分配中的一个,上面的四个保留中的 4)。您将对象添加到自动释放队列中,因此稍后它将接收释放并将保留计数减少一。最后弹出视图应该再减少一个。这将使保留计数为 3。所以我认为您会有内存泄漏。

不过,如果您使用的是 ios 5,最新的编译器使用 ARC(自动引用计数),您无需担心这个问题。大多数情况下都很好。

已编辑:当对象从自动释放池发送释放时已更正。看: Advanced Memory Management抱歉信息有误。

【讨论】:

不是“经过一定时间”。当有人在自动释放池上调用 drainrelease 时,通常是创建它的同一个函数,位于调用堆栈的某个位置。 文档说(或至少曾经说过)类似于“一段时间后”的内容。对于默认池,我相信它在运行循环的每个“循环”结束时。在任何情况下,添加的对象至少在当前方法/函数返回之前应该仍然存在。 所以基本上它一个“延迟发布”,除非你有一个自定义池并立即将其排空,我猜。 @ranReloaded 我记得一个自动释放的对象只存在了很短的时间。它的目的是给你足够的时间来使用它,然后它就消失了。你总是可以创建另一个自动释放池,你可以随时耗尽它们中的任何一个。但我似乎再也无法在文档中找到它及时删除对象的地方。所以我想我要么记错了,要么使用 ARC,自动释放的工作方式不同。 你是对的。 “短时间”有多短,显然取决于具体情况。我相信,取得所有权并在完成后释放它是明智的做法。

以上是关于自动释放和保留的使用的主要内容,如果未能解决你的问题,请参考以下文章

基本保留、自动释放问题

我应该在重新分配之前调用分配给保留属性的自动释放对象的释放吗?

从自动释放对象上的保留转向引用是不是需要释放?

使用点语法设置保留属性时使用自动释放?

iPhone - 如果在自动释放后保留会发生啥?

保留/自动释放已保留财产的额外好处是啥?