Ios 圆弧是否保留在方法参数内分配的对象
今天我对ARC的知识进行了测试,我无意中发现了一个题为“语句嵌套”的例子,在我看来这似乎是错误的 在上面显示的示例中,用绿色下划线突出显示的行表示,函数中分配的字符串在创建时将首先获得一个retain count+1,然后在添加到数组时再次获得+1,然后在for循环后数组为nil时,字符串的retain count将减少1,保留原始字符串的保留计数为1,因此不会解除分配 我假设编译器足够聪明,至少可以使这样的对象在开始时没有实际的保留计数,因为如果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
[[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释放内存”。啊,我明白了,因此,如果它不是一个参数,它只是在声明后立即放弃其所有权,但在那一点上,它是被解除分配的,还是在被解除分配之前到达自动释放池的末尾?(我假设是前者,因为你提到自动释放池没有被使用,但似乎有点模棱两可,只是想澄清一下)自动释放池没有在这种情况下使用,因为它不是一个自动释放的对象。