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

Posted

技术标签:

【中文标题】iPhone - 如果在自动释放后保留会发生啥?【英文标题】:iPhone - What happens if retain after autorelease?iPhone - 如果在自动释放后保留会发生什么? 【发布时间】:2011-01-16 02:34:21 【问题描述】:

你知道如果我保留一个自动释放的对象会发生什么吗? 它会被释放还是保留获胜?

【问题讨论】:

最简单的找出方法就是尝试一下。修改您的代码,构建并运行。告诉我们你的发现。 %) 【参考方案1】:

你知道如果我保留会发生什么 一个自动释放的对象?那将会 释放还是保留获胜?

retain“获胜”,但这样想就充满了失败。

保留和释放只是增加或减少对象保留计数的机制。自动释放只是延迟释放;不多不少。

如果您保留一个自动释放的对象,您现在正在增加保留计数,而保留计数将在以后减少。这事儿常常发生; [NSString stringWithFormat: @"...."] 返回一个自动释放的字符串,如果您希望它在[最常见的情况下]当前通过事件循环后继续存在,则 retain 会返回该字符串。

【讨论】:

【参考方案2】:

如果你想保留你的变量,你需要保留它。例如:

myButton = [[UIButton buttonWithType:...] retain];

buttonWithType: 方法返回一个已用 autorelease 实例化的 UIButton。它会在需要时自行释放(可以这么说)。

【讨论】:

【参考方案3】:

保留将胜出。这是很常见的,是一种例外的做法。

通常方便的方法返回自动释放的对象,如

[NSString stringWithFormat:@""];

希望您保留所需的任何对象,只要您记得稍后释放它们。

请记住,自动释放将发生在当前系统消息的末尾。

来自下面的文章: “系统会为每条系统处理的消息创建一个自动释放池,并且在对该消息的处理完成后,池中的对象都会自动释放。”

可以在这里找到一些很好的解释:

http://www.iphonedevsdk.com/forum/iphone-sdk-tutorials/7295-getters-setters-properties-newbie.html

【讨论】:

非常好的答案,除了自动释放不会(必然)在当前方法结束时发生。自动释放的对象仅在池耗尽时才释放,并且通常仅在每次运行循环时发生一次。您自动释放的对象有可能会保留很长时间。 @kubi:从我发布的文章中“为系统处理的每条消息创建一个自动释放池,并且在处理完该消息后,池中的所有对象都会自动释放。”我不是指当前消息,我指的是当前系统消息。我会更正我的帖子。 “当前系统消息”在概念上是正确的,但更准确的术语是“当前事件”,通常是“运行循环处理的当前事件”。请注意,GCD 队列还为每个队列管理一个自动释放池(在某些情况下或更多),但排放量远不如运行循环具有确定性。

以上是关于iPhone - 如果在自动释放后保留会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

声音播放完毕后 AVAudioPlayer 实例会发生啥? [关闭]

如果我在释放对象所属的池后释放对象会发生啥?

如果将弱属性分配给强属性会发生啥?

iPhone 开发 - 释放一个自动释放的对象

mysql缓存啥情况下会释放

如果关闭并删除iPhone上所有的备份记录会发生啥?因为我的备份空间不足了,如何把以前备份的数据