1

当我收到内存警告时,我正在释放存储在 NSMutableArray 中的一堆对象。

[_children release];

我还需要在某个时候递归遍历对象(可能在发生内存警告之后),所以我需要检查对象是否仍然存在,这与 nil 进行比较是行不通的,因为释放数组没有任何东西。

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

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

4

2 回答 2

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”的保留计数减一。要么它仍然大于零,在这种情况下“a”将不被释放,要么它为零,在这种情况下它被释放。在 a 被释放后将其引用设置为 nil 对仍然指向“a”的其他变量没有影响。

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

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

于 2009-08-18T11:26:35.787 回答
0

假设您没有在其他地方保留数组元素,肯定是通过从数组中删除一个对象,或者释放数组本身,您也释放了元素。我认为这就是你需要做的。

从苹果文档:

每个对象在其 id 被添加到数组之前收到一条保留消息,并在从数组中删除或解除分配数组时收到一条释放消息

于 2009-08-18T11:18:03.683 回答