ARC 是否保留在方法参数内分配的 objects

Does ARC retain objects alloced inside a method parameter

今天测试了我对 ARC 的了解,我偶然发现了 this article,它在 "Nesting of statements" 标题下有一个示例,在我看来似乎是错误的。

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

我本以为编译器足够聪明,至少可以使 object 这样的 object 最初实际上没有保留计数,因为如果您只有

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

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

这篇文章有误还是我对 ARC 的理解有问题?

ARC 在这里没有缺陷。感觉文章不对。

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

文章有误。

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

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

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

HTH