在Objective-C中,如果使用mutableCopy将array1复制到array2上,并假设代码在main()中完成,谁负责释放数组中包含的对象?是main()还是array2?
答案 0 :(得分:13)
我认为之前的答案已经错过了重点,否则提问者很不清楚。实际的问题不是讨论数组,而是数组内容:
谁负责释放数组中包含的对象?是main()还是array2?
array1
和array2
都负责释放对象。
“数组保持对其内容的强引用 - 在托管内存环境中,每个对象在其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];
// ...
}
此代码直接分配obj1
和obj2
,因此它拥有它们并且必须释放它们,但它会自动释放obj3
,因此它不必释放它。以同样的方式,它不拥有arrayWithObjects:
的结果,因此它不会释放它,但它确实拥有mutableCopy
的结果,所以它必须释放它。存储在数组中的对象是无关紧要的 - 您需要关心的是所有权。
两个数组都保留了对其内容的强引用,因此只要数组存在,obj1
,obj2
和obj3
就不会被释放 - 但这是{的详细信息{1}}合同,它不会影响您管理对象或数组的所有权的方式。
这些是Cocoa's memory management conventions的所有细节,而不是数组。
答案 3 :(得分:-5)
将可变数组绑定到不可变数组是没有意义的。 main()将负责释放array1。
但根据我的经验,释放对象只会导致应用程序崩溃。 ObjC非常擅长自动管理内存。我的Cocoa应用程序似乎不需要比开始时更多的内存,即使在运行了几个小时之后。