应该释放“removeAllObjects”吗?

时间:2010-08-27 12:16:17

标签: iphone objective-c memory-management nsmutablearray

我决定开始使用removeAllObjects,以便我可以重用一些NSMutableArrays。但是,我发现对removeAllObjects的调用导致数组被释放,因此当第二次显示viewController时它会崩溃。

我看过网络,似乎有些人说removeAllObjects只是清除他们的数组,而其他人则说它也会释放数组。这是真的吗?它似乎为我释放,但我发现这很奇怪,并期望行为只是释放数组中的对象。文档中没有任何内容警告这一点,我也觉得很奇怪。

编辑:随着NSZombies的开启,我得到的全部是:

  
      
  • - [__ NSArrayM removeAllObjects]:发送到解除分配的实例0x625e4e0的消息
  •   

基本上告诉我,因为数组是由于removeAllObjects而释放的,所以第二次不能调用removeAllObjects ...... Argh!

有人可以帮忙吗?

谢谢!

6 个答案:

答案 0 :(得分:3)

removeAllObjects释放数组中的对象但对数组本身没有影响(除了使其为空)。

<强>除非

数组中的一个或多个对象具有对数组本身的保留引用。

答案 1 :(得分:3)

好的,所以我是个白痴!

我在做:

[myArray removeAllObjects];
myArray = someOtherObject.someArray;

因此将指针重置为某个其他对象。我现在改为:

[self.myArray removeAllObjects];
[self.myArray addObjectsFromArray:someOtherObject.someArray];

现在好了。我是个白痴!对不起,谢谢你的帮助!

答案 2 :(得分:2)

正如您所料,

removeAllObjects不会释放数组本身。如果它被释放,问题就在其他地方。您可以使用NSZombie的仪器来检查它的释放位置。

答案 3 :(得分:1)

如果你正在自动释放你的MutableArrays,它们可能会在调用removeAllObjects之后被释放。使用NSZombies来查看它的确切释放位置。

答案 4 :(得分:1)

NSZombies无法告诉您对象的发布位置,因此它会在您第一次向解除分配的对象发送消息时显示。

从该调用向后工作-removeAllObjects,你会发现错误。

答案 5 :(得分:0)

[yourArray removeAllObjects]; 似乎yourArray的元素将以无效方式释放