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 - 如果在自动释放后保留会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章