ios – ARC是否保留在方法参数内分配的对象

前端之家收集整理的这篇文章主要介绍了ios – ARC是否保留在方法参数内分配的对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我对ARC的了解已经在今天进行了测试,我偶然发现了 this article,它在“语句嵌套”标题下有一个例子,在我看来这似乎是错误的.

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

我会假设编译器本身足够聪明,至少可以创建一个类似于最初实际上没有保留计数的对象,因为如果你刚才有

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

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

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

解决方法

这篇文章错了.

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

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

返回一个拥有的对象,就像所有init方法一样.该对象传递给addObject:并且该数组也拥有所有权.在此之后,ARC看到方法不再需要字符串并放弃其所有权 – 将数组保留为唯一所有者.

HTH

猜你在找的iOS相关文章