从NSArray中删除对象是否会自动释放其内存?

时间:2011-10-19 15:51:11

标签: objective-c memory-management memory-leaks nsarray

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

myClass *obj = [[myClass alloc] init];

NSArray *ar = [NSArray array];

[ar addObject: obj];

[ar removeObject: obj];

[pool drain];

从NSArray数组中删除对象会自动释放我之前分配的内存吗?从各种来源我发现的答案似乎是肯定的。问题是如果我测试内存泄漏,xcode仍然抱怨obj尚未发布。那真正发生了什么?

3 个答案:

答案 0 :(得分:3)

收藏集会保留您添加到其中的对象,声称拥有临时所有权。从集合中删除项目时,它会释放对象(及其临时声明)。换句话说,在将对象添加到集合之后以及将其删除之后,保留计数将是相同的。

如果保留计数为0,则回收内存。

在您的代码中,您正在分配一个对象并声明其拥有权。这意味着它的保留计数为1.

然后你将它添加到数组中。该数组保留该对象,获取临时所有权并将其保留计数增加到2。

然后从阵列中删除该对象。该阵列释放该对象并放弃任何所有权声明,使保留计数降至1。

由于在保留计数回到0(没有人对该对象声明)之前不会回收内存,因此不会回收对象的内存。

如果您在将对象添加到数组之前对对象进行了自动释放,或者在删除对象后调用了对象(但不是两者!),则保留计数将为0并且内存将被回收。

答案 1 :(得分:2)

不,你分配它 - >保留计数为1

您将它添加到发送对象的数组中另一个保留 - > 2

从阵列中删除对象,阵列发送一个版本 - > 1

...所以现在保留计数回到1,这是你的初始alloc保留,所以你需要释放它以释放内存。

答案 2 :(得分:2)

是。将对象插入到数组中时,该数组会保留该对象(使其保留计数增加)。如果对象的保留计数为1(即,没有其他保留),那么当它从数组中删除时,保留计数将变为零,并且它有资格被删除。

但是上述场景中的问题是,在将对象添加到数组后,您无法释放对象上的保留(由于alloc / init)。在[obj release]之后插入[ar addObject:obj]

(另请注意,在您的示例中,当您耗尽自动释放池时,整个数组将变为“poof”。)