假设我有一个包含[A,B,C,D,nil];
我有第二个包含[E,F,G,H,I,J,nil];
如果我执行以下操作:
//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]
答案 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的一部分)