2009-08-18 53 views
1

当我收到内存警告时,我释放了一堆存储在NSMutableArray中的对象。当释放NSArray时将对象设置为零

[_children release]; 

我还需要在某一时刻(mem中警告发生后可能)通过对象递归,所以我需要检查,如果对象是仍然存在,这是我用的比较做nil-这ISN”因为释放数组并不是零。

我可以通过阵列移除对象1乘1和因为我不能迭代期间修改的阵列设置为nil,不循环。

这感觉就像我失去了一些明显的东西。我只想释放+无数组中的某些值。

回答

5

很抱歉,但你在做什么,似乎毫无意义的我。您不能将对象设置为零,您只能将对象的引用设置为零,但对其他引用有影响。

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”没有影响。

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

我真的不知道你正在尝试做的,它肯定是可能的,但你是一个完全错误的轨道在这里。

+0

感谢您的澄清。我*在错误的轨道上,并找到了解决方法。我来自C++的背景,所以这不是很明显。在你的例子中,我假设b == nil – Sam 2009-08-18 12:22:59

+1

由于我不知道你在做什么,我不能提出更好的解决方案。如果数组中的对象是您自己的类,那么您当然可以重写dealloc方法(在保留计数达到零时调用此方法),并通知其他对象(例如代理或只是广播通知)您现在将死亡其他对象可以将它们的引用更新为零。 – Mecki 2009-08-18 12:59:33

+0

即使在C++中,如果您有一个指向对象的指针,当对象本身被销毁时,您所持有的地址将不会被清除 - 当保留计数降至0时,您将拥有一个无效指针,就像Objective-C一样;你仍然有一个参考指向内存曾经分配的位置...... – 2009-08-18 15:56:06

0

假设你没有被从阵列中除去的对象,或释放该数组本身你也释放所述元件(多个)保持所述阵列元件别处,肯定。我认为这和你需要做的一样多。

从Apple文档:

每个对象接收之前其ID被添加到阵列 并且当 从阵列中移除或当 阵列被释放的释放消息的保留消息

+0

但我怎么知道它已经发布?我不能查询它,因为它不存在,它使我留下一个悬挂指针... – Sam 2009-08-18 11:20:54

+0

因为Apple API这样说。它说,如果你从数组中移除一个对象,或者释放数组 - 数组对象将被释放。 – teabot 2009-08-18 11:46:51

+0

您误会了 - 我无法在运行时执行(appleAPISaysThisObjectIsReleasedOrNot())。我发现了一个解决方法,所以非常感谢。 – Sam 2009-08-18 12:28:23

相关问题