【发布时间】: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 = nil和array = nil都不需要“帮助 ARC 释放内存”。
标签: ios objective-c automatic-ref-counting