对在Objective-C中复制数组感到困惑

时间:2010-06-08 02:02:58

标签: iphone objective-c cocoa cocoa-touch arrays

假设我有一个包含[A,B,C,D,nil];

的数组X.

我有第二个包含[E,F,G,H,I,J,nil];

的数组Y.

如果我执行以下操作:

//Append y to x
[x addObjectsFromArray:y];

//Empty y and copy x
[y removeAllObjects];
y = [x mutableCopy];

y的价值是多少?是吗?:

[A,B,C,D,E,F,G,H,I,J,nil]

我是否正确执行了复制?

在操作结束时,我想要[A,B,C,D,E,F,G,H,I,J]

3 个答案:

答案 0 :(得分:2)

一开始:

x是[A,B,C,D](nil不是数组的一部分,它只是告诉initWithObjects:对象列表的末尾是哪里)。 y是[E,F,G,H,I,J]

[x addObjectsFromArray:y]; // only works if x is a mutable array

x是[A,B,C,D,E,F,G,H,I,J]

y是[E,F,G,H,I,J]

[y removeAllObjects]; // only works if y is a mutable array.

x是[A,B,C,D,E,F,G,H,I,J]

是[]

y = [x mutableCopy];

x是[A,B,C,D,E,F,G,H,I,J]

y是[A,B,C,D,E,F,G,H,I,J]

请注意,您清空的先前版本的y可能已泄露,因为您使用指向x的新可变副本的指针覆盖了指针。你应该做的:

[y release];
y = [x mutableCopy];

如果您通过使用+ arrayWithObjects获得y:而不是+ alloc后跟-initWithObjects:只需

y = [x mutableCopy]; // release not necessary because you didn't own y (you do now though).

答案 1 :(得分:1)

您的数组是使用arrayWithObjects初始化的。我想,使用这些示例 - 您不能在数组中添加nil。

数组X将是[A,B,C,D,E,F,G,H,I,J],数量为10.

数组Y必须是NSMutableArray(因为你要返回一个可变副本),包含上述内容(如果你正在讨论在addObjectsFromArray之后使用X),它将包含[A,B, C,D]如果你的意思是一个完全独立的例子。

答案 2 :(得分:0)

不完全 - 你将对象附加到x(看起来你明白这一点)然后从y中删除所有对象(看起来你明白了)除了y现在不是n,但是是空数组。当你y = [x mutableCopy];以前在y处泄漏对象时,y现在指向对象x的新副本。虽然这是所有有效的代码,(除了泄漏y)它很奇怪,如果你只想复制数组,你需要做的就是x = [y copy];。另外值得注意的是,数组最后实际上并不包含nil(如果它们不可见,程序员,作为API的一部分)