Objective c 清除/释放阵列阵列的正确方法

Objective c 清除/释放阵列阵列的正确方法,objective-c,cocoa,Objective C,Cocoa,还有我的数组 当我有一个数组“x”包含数组“y”的多个实例时,如何清除/释放它而不冒内存泄漏的风险 以下电话是否足够 (a) 清除阵列 [x removeAllObjects]; [x release]; for(int i=0;i<x.count;i++) [[x objectAtIndex:i] release]; [x removeAllObjects]; for(int i=0;i<x.count;i++) [[x objectAtIndex:i

还有我的数组

当我有一个数组“x”包含数组“y”的多个实例时,如何清除/释放它而不冒内存泄漏的风险

以下电话是否足够

(a) 清除阵列

[x removeAllObjects];
[x release];
for(int i=0;i<x.count;i++)
    [[x objectAtIndex:i] release];
    [x removeAllObjects];
for(int i=0;i<x.count;i++)
    [[x objectAtIndex:i] release];
    [x release];
(b) 释放阵列

[x removeAllObjects];
[x release];
for(int i=0;i<x.count;i++)
    [[x objectAtIndex:i] release];
    [x removeAllObjects];
for(int i=0;i<x.count;i++)
    [[x objectAtIndex:i] release];
    [x release];
还是需要枚举数组,例如:

(c) 清除阵列

[x removeAllObjects];
[x release];
for(int i=0;i<x.count;i++)
    [[x objectAtIndex:i] release];
    [x removeAllObjects];
for(int i=0;i<x.count;i++)
    [[x objectAtIndex:i] release];
    [x release];
for(int i=0;i(b)应该足够了。数组的deallocator将释放所有包含的对象,每个retain都有一个释放(因此,多个实例的释放次数与添加的次数相同)

永远不要执行
[[x objectAtIndex:i]release]
--您没有保留返回的对象,因此释放它会破坏它的保留计数。

(b)应该足够了。数组的deallocator将释放所有包含的对象,每个保留都有一个释放(因此,多个实例的释放次数与添加的次数相同)


永远不要做
[[x objectAtIndex:i]发布]
--您没有保留返回的对象,因此释放该对象会破坏其保留计数。

确保无内存泄漏的最佳方法是,在将该对象添加到数组后,应释放该对象,使对象的保留计数为1,并且只有数组保留该对象。因此,当释放该数组时,它将将向数组中的所有对象发送release消息,所有对象的retainCount将变为0,它们将被释放。确保无内存泄漏的最佳方法是,在将该对象添加到数组后,应释放该对象,使对象的retain count为1,并且只有数组保留该对象的retain删除数组,它将向数组中的所有对象发送释放消息,所有对象的重新计数将变为0,并且它们将被解除锁定

一旦对象添加到数组中,保留计数可能为1,也可能不是1。添加到数组中后,您可能需要也可能不需要释放它。最后,对象可能被解除锁定,也可能不被解除锁定在移除数组时分配。永远不要把保留计数看作是一个绝对值,只是在某个给定时间内的一个对象的保留计数是一个经常超出你控制范围的实现细节。也许你误读了它,但是我并不是说当它从数组中移除时,它将被解除分配。将其移出并重新计数0,它将被解除锁定(不是立即解除锁定,而是在某个时候解除锁定,这也取决于系统).无论如何,我认为这应该是一个很好的实践,并提醒人们,当他们将对象添加到数组中时,重新计数将增加,因此如果他们想确保只有数组保存该对象,他们应该释放该对象object@vadkhang当前位置问题是,如果你甚至想重新计算,那你就错了。你应该只考虑所有权。例如,在上面的d中,如果你问“我是否拥有从objectAtIndex获得的参考资料?”答案是“否”"所以很明显,循环中的释放是错误的。为您的名字拼写错误道歉。一旦对象被添加到数组中,保留计数可能是或可能不是1。除了数组之外,您可能需要或不需要释放它。最后,在移除数组时,对象可能会或可能不会被释放。他把retain count作为一个绝对值,只是你改变了一些东西。对象在任何给定时间的retain count都是一个你无法控制的实现细节。也许你误读了它,但我并不是说当它从数组中移除时,它将被释放。我的意思是,如果你移除它,它得到retainCount 0,它将被释放loc(不是立即,而是有时,也取决于系统).无论如何,我认为这应该是一个很好的实践,并提醒人们,当他们将对象添加到数组中时,重新计数将增加,因此如果他们想确保只有数组保存该对象,他们应该释放该对象object@vadkhang当前位置问题是,如果你甚至想重新计算,那你就错了。您应该只考虑所有权。例如,在上面的d中,如果您问“我是否拥有从objectAtIndex获得的引用:?答案是“否”,因此很明显,循环中的发布是不正确的。请为拼写错误道歉。如果:(a)和(b)有效;(c)和(d)无效(它们过度释放数组中的对象,这将导致崩溃)。如果要保留数组以便以后将对象放入其中,请使用(a)。如果要完全处置数组(如
dealoc
),请使用(b)。如果:(a)和(b)有效;(c)和(d)无效(它们过度释放数组中的对象,这将导致崩溃)。如果要保留数组以便以后将对象放入其中,请使用(a)。如果要完全处置数组(如
dealoc
),请使用(b)。