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

ios – ARC是否保留在方法参数内分配的对象,第1张

概述我对ARC的了解已经在今天进行了测试,我偶然发现了 this article,它在“语句嵌套”标题下有一个例子,在我看来这似乎是错误的. 在上面嵌入的示例中,用绿色下划线突出显示的行表示在函数内部分配的字符串在创建时首先获得保留计数1,然后在添加到数组时再次获得1,然后一旦数组为nil’在for循环之后,字符串的保留计数将减少1,原始字符串的保留计数为1,因此不会被解除分配. 我会假设编译器本身足 我对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

总结

以上是内存溢出为你收集整理的ios – ARC是否保留在方法参数内分配的对象全部内容,希望文章能够帮你解决ios – ARC是否保留在方法参数内分配的对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1103627.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存