复制时谁负责释放数组中的对象?

时间:2009-07-06 15:41:05

标签: objective-c cocoa memory-management nsarray

在Objective-C中,如果使用mutableCopy将array1复制到array2上,并假设代码在main()中完成,谁负责释放数组中包含的对象?是main()还是array2?

4 个答案:

答案 0 :(得分:13)

我认为之前的答案已经错过了重点,否则提问者很不清楚。实际的问题不是讨论数组,而是数组内容:

  

谁负责释放数组中包含的对象?是main()还是array2?

array1array2 都负责释放对象。

来自NSArray documentation

  

“数组保持对其内容的强引用 - 在托管内存环境中,每个对象在其id添加到数组之前接收保留消息,并在从数组中删除时或在数组中删除时发送消息被解除分配。“

首先,每个对象都由NSArray array1保留。当您通过array2创建-mutableCopy时,会得到一个NSMutableArray,它指向相同的对象,并再次保留每个对象。如果此时要释放array1,则在调用其dealloc方法时,它将释放它包含的每个对象。但是,array2保留了它们,因此对象不会被销毁 - 只有当它们的保留计数达到0时才会被销毁,如果array2被销毁而没有其他人保留任何对象(或者当他们从array2移除时。

由于集合类(数组,集合,字典等)处理保留和释放其内容,因此您需要担心的是保留或释放集合本身。由于您使用了-mutableCopy,请记住您已隐式保留array2,因此您应该在完成后将其释放。

答案 1 :(得分:1)

我在Obj-C中引用了this guide内存管理。他有一个关于阵列和词典的部分,这里有一段摘录:

  

数组,字典等通常会保留添加到其中的任何对象。 (处理第三方集合类型对象时,请始终检查文档以确定它们是否保留)。这意味着这些集合将获得对象的所有权,并且在添加之前不需要保留。

发布的评论也很有用

答案 2 :(得分:1)

通过在数组中存储对象不会更改所有权职责。这是一个例子:

int main(int argc, char *argv[])
{
    // ...

    NSObject *obj1 = [[NSObject alloc] init]; // owned
    NSObject *obj2 = [[NSObject alloc] init]; // owned
    NSObject *obj3 = [[[NSObject alloc] init] autorelease]; // not owned

    NSMutableArray *array1 = [NSMutableArray arrayWithObjects: obj1, obj2, obj3, nil]; // not owned
    NSMutableArray *array2 = [array1 mutableCopy]; // owned

    // ...

    [array2 release];
    [obj2 release];
    [obj1 release];

    // ...
}

此代码直接分配obj1obj2,因此它拥有它们并且必须释放它们,但它会自动释放obj3,因此它不必释放它。以同样的方式,它不拥有arrayWithObjects:的结果,因此它不会释放它,但它确实拥有mutableCopy的结果,所以它必须释放它。存储在数组中的对象是无关紧要的 - 您需要关心的是所有权。

两个数组都保留了对其内容的强引用,因此只要数组存在,obj1obj2obj3就不会被释放 - 但这是{的详细信息{1}}合同,它不会影响您管理对象或数组的所有权的方式。

这些是Cocoa's memory management conventions的所有细节,而不是数组。

答案 3 :(得分:-5)

将可变数组绑定到不可变数组是没有意义的。 main()将负责释放array1。

但根据我的经验,释放对象只会导致应用程序崩溃。 ObjC非常擅长自动管理内存。我的Cocoa应用程序似乎不需要比开始时更多的内存,即使在运行了几个小时之后。