【问题标题】:Does ARC retain objects alloced inside a method parameterARC 是否保留在方法参数内分配的对象
【发布时间】:2016-03-09 06:14:52
【问题描述】:

我对 ARC 的了解今天已经过测试,我偶然发现了this article,它在“嵌套语句”标题下有一个示例,在我看来这似乎是错误的。

在上面显示的嵌入示例中,以绿色下划线突出显示的行表示在函数内部分配的字符串在创建时将首先获得保留计数 +1,然后在添加到数组时再次获得 +1,然后一次在 for 循环之后数组被 nil'ed,字符串的保留计数将减少 1,使原始字符串保留计数为 1,因此不会被释放。

我会假设编译器足够聪明,至少可以使这样的对象最初实际上没有保留计数,因为如果你刚刚有

[[NSString alloc] initWithFormat:@"Name 1"]];

这个被分配的字符串没有任何指向它的东西,并且会在自动释放池结束时被释放,而不是永远保留计数为 1。那么为什么它在函数的参数中会有不同的行为呢? (除非该行的保留计数为 1,并且这在某种程度上是内存泄漏?否则它最多可以在其范围结束之前保留计数为 1,但是如果它也是一个参数,那么该逻辑将适用我会假设)

这篇文章是错的还是我对 ARC 的理解有缺陷?

【问题讨论】:

  • 文章有误。以及为什么他们一直显示alloc init,而我们有在方法范围内使用的便捷方法……很奇怪。
  • 文章有误(如下指出)。你会在clang.llvm.org/docs/… 中找到血淋淋的细节:“当接收到来自这样一个函数或方法的返回结果时,ARC 会释放它包含的完整表达式末尾的值,但需要进行通常的优化用于本地值。”name = nilarray = nil 都不需要“帮助 ARC 释放内存”。

标签: ios objective-c automatic-ref-counting


【解决方案1】:

文章有误。

您的理解基本上是正确的,尽管在这种情况下没有使用自动释放池。子表达式:

[[NSString alloc] initWithFormat:@"Name 1"]];

返回一个拥有的对象,所有init 方法也是如此。该对象被传递给addObject:,并且该数组也拥有所有权。此后 ARC 发现该方法不再需要该字符串并放弃其所有权 - 将数组作为唯一所有者。

HTH

【讨论】:

  • 啊,我明白了,所以如果它不是参数,它只是在声明后立即放弃其所有权,但此时它是否被释放,或者它在被释放之前到达自动释放池的末尾解除分配? (我假设前者,因为您提到了未使用的自动释放池,但您在谈论哪种情况似乎有点模棱两可,只是想澄清一下)
  • 在这种情况下不使用自动释放池,因为它不是自动释放的对象。
【解决方案2】:

ARC 在这里没有缺陷。感觉文章写错了。

ARC 将按预期释放分配的参数对象,同时数组保持其引用。一旦数组被释放,对象将不再有引用,并且它也将被释放,正如预期的那样。

【讨论】:

  • 如果我们可以让更多的人同意我们的观点,那么可能会在文章评论部分发布此内容,以提醒他们或找到该文章的任何其他人
猜你喜欢
  • 2014-01-13
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多