释放NSArray时将对象设置为nil

时间:2009-08-18 10:59:11

标签: iphone objective-c release nsmutablearray null

当我收到内存警告时,我发布了一堆存储在NSMutableArray中的对象。

[_children release];

我还需要在某个时刻通过对象递归(可能是在发生了mem警告之后),所以我需要检查对象是否还在,我与nil进行比较 - 这是不行的因为释放数组不会有任何结果。

我无法循环遍历数组,逐个删除对象并设置为nil,因为我不允许在迭代期间修改数组。

感觉我错过了一些明显的东西。我只想在数组中释放+ nil一些值。

2 个答案:

答案 0 :(得分:5)

抱歉,但你所做的对我来说似乎毫无意义。您不能将对象设置为nil,只能将对象的引用设置为nil,但这会影响其他引用。

NSObject * a = [[NSObject alloc] init];
NSObject * b = a;

[a release];
a = nil;

// b is NOT nil! b still points to the memory location where
// a used to be, which is now not valid anymore and using b
// for anything may crash your application!

如果我将“a”放入数组然后再从数组中删除它,则“a”的保留计数减1。要么它仍然大于零,在这种情况下“a”将不会被释放或它是零,在这种情况下它被释放。释放后将a的引用设置为nil对其他仍然指向“a”的变量没有影响。

因此,即使NSArray在将其移除到数组并释放它之后将对“a”的引用设置为nil(因为它的引用计数为零),它对仍然指向“a”的实例变量没有影响

我不确定你要做什么,这当然是可能的,但你在这里完全错了。

答案 1 :(得分:0)

假设您没有将数组元素保留在其他位置,当然通过从数组中删除对象,或释放数组本身,您也释放了元素。我认为这就是你需要做的事情。

来自Apple文档:

  

每个对象都会收到一条保留消息   在将其id添加到数组之前   它是一个发布消息   从数组中删除或何时删除   数组已取消分配