gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:08:45 24 4
gpt4 key购买 nike

今天测试了我对 ARC 的了解,我偶然发现了 this article它在“语句嵌套”标题下有一个示例,在我看来这似乎是错误的。

example

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

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

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

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

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

最佳答案

这篇文章是错误的。

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

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

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

HTH

关于ios - ARC 是否保留在方法参数内分配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35884303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com