我对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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。