2

假设我有一个NSMutableArray *sasquatch里面有一些数组。

在 ARC 中,如果我调用[sasquatch removeAllObjects];这是否会导致 sasquatch 数组中的所有数组都为零?这样 sasquatch 数组的数组中的对象也都被删除并释放等等?

因为我不知道我是否应该这样做:

 for (NSArray *animalPlanetSearchingFor in sasquatch){
[animalPlanetSearchingFor removeAllObjects];
}

在我打电话之前[sasquatch removeAllObjects];

4

1 回答 1

4

它不会递归地清空所有数组——它会在删除时减少它们的引用计数。当数组的引用计数为 0 时,将删除所有对象。他们自己清理。

iow,sasquatch的子数组没有改变——有一个例外:如果sasquatch持有对该子数组的最后一个引用。在这种情况下,元素(大脚野人的子数组)将被释放。

在 ARC 中,如果我调用 [sasquatch removeAllObjects]; 这会导致 sasquatch 数组中的所有数组都为零吗?

好吧,它只是向release每个元素发送一个更改count(等等)。NSArrays不能容纳nil元素——这是被禁止的。

因此,如果您创建copy数组 - 然后将添加对子数组的引用,并且您将延长子数组的生命周期,因为副本现在也持有引用。

这样 sasquatch 数组的数组中的对象也都被删除并释放等等?

如果 sasquatch 持有最后一个引用,则子数组将在那时被释放。请记住,自动释放池中也可能存在引用,因此您的销毁顺序没有明确定义——即使在最简单的情况下也是如此。

另一种看待它的方式:sasquatch当它的最后一个引用丢失时,其中的所有内容及其子数组(递归)都将被销毁——只有当每个元素都是最后一个持有的引用时。

简而言之——removeAllElements在这两种情况下都不需要调用来进行清理。

于 2012-08-14T21:27:41.663 回答