Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 圆弧是否保留在方法参数内分配的对象_Ios_Objective C_Automatic Ref Counting - Fatal编程技术网

Ios 圆弧是否保留在方法参数内分配的对象

Ios 圆弧是否保留在方法参数内分配的对象,ios,objective-c,automatic-ref-counting,Ios,Objective C,Automatic Ref Counting,今天我对ARC的知识进行了测试,我无意中发现了一个题为“语句嵌套”的例子,在我看来这似乎是错误的 在上面显示的示例中,用绿色下划线突出显示的行表示,函数中分配的字符串在创建时将首先获得一个retain count+1,然后在添加到数组时再次获得+1,然后在for循环后数组为nil时,字符串的retain count将减少1,保留原始字符串的保留计数为1,因此不会解除分配 我假设编译器足够聪明,至少可以使这样的对象在开始时没有实际的保留计数,因为如果 [[NSString alloc] init

今天我对ARC的知识进行了测试,我无意中发现了一个题为“语句嵌套”的例子,在我看来这似乎是错误的

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

我假设编译器足够聪明,至少可以使这样的对象在开始时没有实际的保留计数,因为如果

[[NSString alloc] initWithFormat:@"Name 1"]];
这个被分配的字符串将没有任何指向它的内容,并且将在自动释放池结束时释放,而不是永远保留计数为1。那么,当它在函数的参数中时,为什么会有不同的行为呢?(除非该行的retain count为1,并且这在某种程度上是内存泄漏?否则它的retain count为1,直到它的作用域结束为止,这是最确定的,但如果我假设它也是一个参数,那么该逻辑将适用)


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

这里ARC没有缺陷。听起来这篇文章是错的

ARC将按预期释放分配的参数对象,同时数组保留其引用。一旦释放了数组,对象将不再有引用,并且它也将按预期被释放

这篇文章错了

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

[[NSString alloc] initWithFormat:@"Name 1"]];
返回一个拥有的对象,就像所有
init
方法一样。该对象被传递到
addObject:
,数组也拥有所有权。在此之后,ARC发现该字符串不再是方法所需的,并放弃其所有权-将数组保留为唯一的所有者


HTH

如果我们能让更多的人同意我们的观点,那么我可能会在文章评论部分发布这篇文章,提醒他们或其他发现文章错误的人。为什么它们一直显示
alloc init
,而我们在方法范围内使用方便的方法。。。奇怪,这篇文章是错的(如下所述)。你会在下面的文章中找到血淋淋的细节:“当从这样一个函数或方法接收返回结果时,ARC会释放包含在其中的完整表达式末尾的值,这取决于对局部值的通常优化。”–不需要使用
name=nil
array=nil
来“帮助ARC释放内存”。啊,我明白了,因此,如果它不是一个参数,它只是在声明后立即放弃其所有权,但在那一点上,它是被解除分配的,还是在被解除分配之前到达自动释放池的末尾?(我假设是前者,因为你提到自动释放池没有被使用,但似乎有点模棱两可,只是想澄清一下)自动释放池没有在这种情况下使用,因为它不是一个自动释放的对象。