假设我有NSMutableArray *sasquatch
,其中包含一些数组。
在ARC中,如果我调用[sasquatch removeAllObjects];
,这会导致sasquatch数组中的所有数组都为零吗?那么sasquatch数组的数组中的对象也都被删除了并且释放了东西?
因为我不知道我是否应该这样做:
for (NSArray *animalPlanetSearchingFor in sasquatch){
[animalPlanetSearchingFor removeAllObjects];
}
在致电[sasquatch removeAllObjects];
答案 0 :(得分:4)
它不会递归地清空所有数组 - 它会在删除时减少它们的引用计数。当数组的引用计数为0时,将删除所有对象。他们自己清理干净。
iow,sasquatch
的子数组没有改变 - 有一个例外:如果sasquatch
持有对该子数组的最后一个引用。在这种情况下,元素(sasquatch的子数组)将被释放。
在ARC中,如果我调用[sasquatch removeAllObjects];这会导致sasquatch数组中的所有数组都为nil吗?
好吧,它只是向每个元素发送release
并更改count
(等等)。 <{1}}无法容纳NSArrays
个元素 - 它是被禁止的。
因此,如果您创建一个nil
数组 - 那么将添加对子数组的引用,并且您将延长子数组的生命周期,因为该引用现在也由副本保存
那么sasquatch数组的数组中的对象也都被删除了,并且释放了东西吗?
如果sasquatch持有最后一个引用,那么子阵列将在那时被释放。请记住,引用也可能存在于自动释放池中,因此您的销毁顺序未明确定义 - 即使在最简单的情况下也是如此。
另一种看待它的方法:copy
及其子数组(递归)中的所有内容将在其最后一个引用丢失时被销毁 - 仅当每个元素都是最后一次参考。
简而言之 - 在任何一种情况下都无需为了清理而调用sasquatch
。