2011-07-11 18 views

回答

6

释放数组与删除数组中的所有项目具有相同的效果。也就是说,数组不再声明它们的所有权。如果其他人保留了这些对象,它们将继续存在。如果没有,他们将被释放。

这只是一组正常的内存规则。如果你保留一个对象,你必须释放它。相反,其他一些代码(如数组)也可以保留并释放该对象,但如果每个人都遵守规则,则没有人会感到惊讶。

+0

对象不会被释放,直到它们的保留计数为零。他的问题是数组中的对象的保留数大于1(例如,retainCount = 2)。当数组被释放时,数组中的对象将减少其所有保留计数(例如,retainCount = 1),如果没有其他对象拥有对它们的所有权(因为retainCount> 0),它们将是内存泄漏。 – pokstad

1

retain调用看作+1,将release调用看作-1。您的通话释放NSArray释放NSArray,然后这反过来将发送release到其持有的每一个项目,但由于NSArray对他们采取了retain,当你加入他们来说,这只是平衡其retain/release电话。

通常最好集中更多的精力来平衡你的retainrelease调用,而不是想象在任何特定时间保留的次数。

1

自从retainCount == 0以后,您发送该版本时,您的数组将被释放。当程序解除分配集合类型对象(如数组)时,它将对集合中的所有对象执行释放。所有发布都会减少保留计数。直到retainCount == 0才会发生取消分配。因此,如果数组中的对象具有retainCount == 2,那么在数组解除分配后,它们将具有retainCount == 1。如果没有其他变量引用这些对象中的任何一个,那么它们将继续作为内存泄漏而存在。

+0

当数组_deallocated_时,数组只会对其所有项目执行'release',而不是像第一句所说的那样简单地释放它。此外,当您在最后一句中说“拥有”时,我认为您的意思是“有一个参考”,即指向,因为保留计数本身代表所有权。 –

+0

谢谢,注意到并且合并。 – pokstad

0

严格来说,当retainCount为1并释放数组时,数组将被“释放”。在数组解除分配之前,数组将向该数组中的每个元素发送release消息。我想你可以想象其余的。

相关问题