在数组中调用方法removeAllObjects时会发生什么?

时间:2012-08-14 21:25:30

标签: objective-c arrays

假设我有NSMutableArray *sasquatch,其中包含一些数组。

在ARC中,如果我调用[sasquatch removeAllObjects];,这会导致sasquatch数组中的所有数组都为零吗?那么sasquatch数组的数组中的对象也都被删除了并且释放了东西?

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

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

在致电[sasquatch removeAllObjects];

之前

1 个答案:

答案 0 :(得分:4)

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

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

  

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

好吧,它只是向每个元素发送release并更改count(等等)。 <{1}}无法容纳NSArrays个元素 - 它是被禁止的。

因此,如果您创建一个nil数组 - 那么将添加对子数组的引用,并且您将延长子数组的生命周期,因为该引用现在也由副本保存

  

那么sasquatch数组的数组中的对象也都被删除了,并且释放了东西吗?

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

另一种看待它的方法:copy及其子数组(递归)中的所有内容将在其最后一个引用丢失时被销毁 - 仅当每个元素都是最后一次参考。

简而言之 - 在任何一种情况下都无需为了清理而调用sasquatch

相关问题