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

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

【问题讨论】:

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

标签: iphone objective-c retain autorelease nsautoreleasepool


【解决方案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 队列还为每个队列管理一个自动释放池(在某些情况下或更多),但排放量远不如运行循环具有确定性。
      猜你喜欢
      • 2012-09-11
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多