1.Assignment谁能告诉我NSArray的赋值和拷贝之间的区别?
NSArray* a = xxxxxx;
NSArray* b;
b = a;
2.复印
NSArray* a = xxxxxx;
NSArray* b;
b = [a copy];
我知道副本是 “轻副本”,可变副本是 “深层复制”。
拷贝是拷贝内存地址,而可变拷贝是拷贝内存对象。
但我不知道任务和副本的不同。
这是一样的吗?
1.Assignment谁能告诉我NSArray的赋值和拷贝之间的区别?
NSArray* a = xxxxxx;
NSArray* b;
b = a;
2.复印
NSArray* a = xxxxxx;
NSArray* b;
b = [a copy];
我知道副本是 “轻副本”,可变副本是 “深层复制”。
拷贝是拷贝内存地址,而可变拷贝是拷贝内存对象。
但我不知道任务和副本的不同。
这是一样的吗?
This苹果文档是有帮助的:
正常的拷贝是浅拷贝,产生一个新的集合与原对象的 股份所有权。深度复制从原始创建新对象并将其添加到新集合中。
因此,在你的第一个例子,b
指向相同的NSArray实例作为a
。在第二个示例中,b
指向一个新的NSArray实例,该实例包含对a
指向的数组中包含的相同对象的引用。
b = a;
b
指向的地址与a
指向的地址相同。所以改变任何一个都是一样的。这被称为call by reference
。
b = [a copy];
正在创建a
的另一个对象,并指向b
。这里形成了两组不同的物体,所以改变任何一个物体都将是相互独立的。这就像call by value
。并且这里b
将保存a
的不可变拷贝,即使a
是可变的。
这实际上是不正确的 - 第一个不是浅拷贝,只是将'b'指向与a'相同的对象;第二个是浅的复制 – Alex
@Alexander:谢谢...编辑:) –
恩......我明白了,我认为你是对的,非常感谢你。 – H3c
我还有一个问题。如果我使用副本,我更改b的数据,那么a的数据也会改变? – H3c
这取决于你所说的'改变b的数据'。如果你从一个对象中删除对象(你需要使用NSMutableArray来完成这个任务,那么不需要改变b(因为b保留了对象)如果你改变了一个对象的属性,那么你会看到同样的对象在b。 – Alex