【问题标题】:Why alloc method can add retain count为什么 alloc 方法可以添加保留计数
【发布时间】:2017-07-17 17:27:35
【问题描述】:

当我们用 Class 调用 alloc 时,我知道 Object 的计数会 +1。例如:NSObject *obj = [NSObject alloc];,obj 的引用计数将是 1。我阅读了源代码,但是我找不到可以告诉我为什么 alloc 可以添加引用计数的代码。还有一些博客说alloc 会调用retain 方法,所以它可以+1。但我找不到一些代码可以证明这一点。有人能告诉我为什么alloc 会增加引用计数吗?

【问题讨论】:

  • +alloc返回时保留计数不一定为1。

标签: objective-c memory-management


【解决方案1】:

您找不到在+alloc 中加一的通用代码。通常在+alloc内部,对象是新创建的,并获得RC 1。(所以你可以说加了1,因为它创建之前的对象的RC为0。当然,这在形式上是不正确的,因为在创建时没有对象,因此它不能有 RC。类似于零是空反模式。)

但是,类可以覆盖+alloc 以返回现有对象而不是新对象。例如,这在过去是为了实现单例而完成的。在这种情况下,+alloc 必须发出新引用的信号(+alloc 进行所有权转移)并且确实必须添加 1。像这样的东西(示例代码):

+(id)alloc
{
  if(mySingleton==nil) // it is not already created
  {
    return mySingleton = [super alloc];
  }
  return [mySingleton retain]; // ownership transfer
}

我认为在某些文章中说“+1”而不是“1”的想法是,您应该单独查看每个参考。所以RC没有绝对值。无论您对引用及其对象执行什么操作,都相对 与您执行此操作之前的情况有关。出于这个原因,一些作者总是用“+1”和“-1”来描述 RC。当然,如果是新创建的对象,这是没有意义的。

【讨论】:

  • 除了你的最后一句话外,其他地方都在。将新创建的对象称为具有+1 保留计数绝对是正确的方法。实际的保留计数永远不会被视为绝对值,即使是从+alloc 返回时也不行。
  • 我同意你的看法。但是 如果 它是新创建的,RC 为 1 或 +1 确实意味着相同,因为不能有额外的引用将 RC 推到更高的值。 (当然它不能有更低的值。)
  • 实际上,+alloc 的结果可能返回的不是 RC 1 的对象。有几个(被误导的)缓存实现在+alloc 中添加了一个额外的retain,返回RC 为 2 的对象 t,调用者仅负责平衡其中一个。确实,+alloc 的返回值应始终视为+1 而不是绝对值。
  • 但是没有人应该将被误导的代码作为他论证的一部分。
  • 误导,是的。但正确且完全支持的实施。最重要的是,保留计数应始终被视为增量。将其视为对象生命周期中任何时候的已知、恒定、绝对值在技术上和事实上都是不正确的。
【解决方案2】:

alloc 不会增加计数。在您调用alloc 之前,没有任何对象,因此没有什么可计算的。该对象以一个引用存在,因此它从 alloc 返回,保留计数为正 1。

(相反,如果引用少于一个,则对象已死。)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-11-10
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
相关资源
最近更新 更多