2013-01-18 40 views
3

1.Assignment谁能告诉我NSArray的赋值和拷贝之间的区别?

NSArray* a = xxxxxx; 

NSArray* b; 

b = a; 

2.复印

NSArray* a = xxxxxx; 

NSArray* b; 

b = [a copy]; 

我知道副本是 “轻副本”,可变副本是 “深层复制”。

拷贝是拷贝内存地址,而可变拷贝是拷贝内存对象。

但我不知道任务和副本的不同。

这是一样的吗?

回答

2

This苹果文档是有帮助的:

正常的拷贝是浅拷贝,产生一个新的集合与原对象的 股份所有权。深度复制从原始创建新对象并将其添加到新集合中。

因此,在你的第一个例子,b指向相同的NSArray实例作为a。在第二个示例中,b指向一个新的NSArray实例,该实例包含对a指向的数组中包含的相同对象的引用。

+0

恩......我明白了,我认为你是对的,非常感谢你。 – H3c

+0

我还有一个问题。如果我使用副本,我更改b的数据,那么a的数据也会改变? – H3c

+1

这取决于你所说的'改变b的数据'。如果你从一个对象中删除对象(你需要使用NSMutableArray来完成这个任务,那么不需要改变b(因为b保留了对象)如果你改变了一个对象的属性,那么你会看到同样的对象在b。 – Alex

0

b = a;b指向的地址与a指向的地址相同。所以改变任何一个都是一样的。这被称为call by reference

b = [a copy];正在创建a的另一个对象,并指向b。这里形成了两组不同的物体,所以改变任何一个物体都将是相互独立的。这就像call by value。并且这里b将保存a的不可变拷贝,即使a是可变的。

+0

这实际上是不正确的 - 第一个不是浅拷贝,只是将'b'指向与a'相同的对象;第二个是浅的复制 – Alex

+0

@Alexander:谢谢...编辑:) –

相关问题