我对ARC的了解已经在今天进行了测试,我偶然发现了this article,它在“语句嵌套”标题下有一个例子,在我看来这似乎是错误的。
在上面嵌入的示例中,用绿色下划线突出显示的行表示在函数内部分配的字符串在创建时首先获得保留计数+1,然后在添加到数组时再次获得+1,然后一次在for循环之后,数组是nil'ed,字符串的保留计数将减少1,原始字符串的保留计数为1,因此不会被解除分配。
我会假设编译器足够智能,至少可以创建一个最初实际上没有保留计数的对象,因为如果你只是
[[NSString alloc] initWithFormat:@"Name 1"]];
这个被分配的字符串没有任何指向它的东西,并且会在自动释放池结束时释放,而不是永久保留计数为1。那么为什么它在函数的参数中会有不同的行为? (除非该行的保留计数为1并且这在某种程度上是内存泄漏?否则它的保留计数可能会一直保持到其范围的最后,但是如果它的参数也是如此,则该逻辑将适用我会假设)
这篇文章是错误的还是我对ARC的理解有缺陷?
答案 0 :(得分:5)
这篇文章错了。
虽然在这种情况下不使用自动释放池,但您的理解基本上是正确的。子表达式:
[[NSString alloc] initWithFormat:@"Name 1"]];
返回拥有的对象,所有init
方法也是如此。该对象传递给addObject:
,该数组也获得所有权。在此之后,ARC看到该方法不再需要该字符串并放弃其所有权 - 将该数组保留为唯一所有者。
HTH
答案 1 :(得分:4)
ARC在这里没有缺陷。听起来这篇文章错了。
当数组保持其引用时,ARC将按预期释放已分配的参数对象。一旦释放了数组,该对象将没有更多的引用,并且它也将按预期释放。