我已经阅读了帖子What is the difference between a deep copy and a shallow copy?中深拷贝和浅拷贝之间差异的答案。现在我有点怀疑,当我们通过
制作浅色副本时 newArray = [NSmutableArray arrayWithArray:oldArray];
新数组将指向oldArray。 (如图所示)。现在当我从newArray中删除对象时会发生什么?如图所示,它应该从oldArray中移除相同的元素!好像是
newArray = oldArray
是浅拷贝,newArray = [NSmutableArray arrayWithArray:oldArray];
是深拷贝。是不是?
答案 0 :(得分:40)
newArary = oldArray
根本不是副本。你最终会得到两个指向完全相同内存位置的指针。
newArray = [NSMutableArray arrayWithArray:oldArray];
是一个浅层副本。最终得到两个不同的数组,因此如果要从一个数组中删除或添加项,则不会影响另一个数组。但是,两个数组中的项是相同的。如果oldArray
的第一个元素是NSMutableDictionary
,并且您为其添加了一个键,那么您在newArray
的第一个元素上也会看到更改(因为这两个对象是相同)。
要进行深层复制,您必须创建一个新数组,并且新数组的每个元素都将是旧数组的相应元素的深层副本。 (是的,该定义是递归的)。
答案 1 :(得分:11)
首先,NSArray
没有深拷贝功能。但是,您可以通过执行以下操作来创建深层复制功能:
@interface NSArray(deepCopy)
-(NSArray *) deepCopy;
@end
@implementation
-(NSArray *) deepCopy
{
NSMutableArray *ret = [NSMutableArray array];
for (id val in self)
{
if ([val conformsToProtocol:@protocol(NSCopying)])
{
[ret addObject:[val copy]];
}
else
{
[ret addObject:val];
}
}
return ret;
}
@end
其次,newArray = oldArray
不会复制数组。它只是使newArray
指向oldArray
指向的数组。
第三,+arrayWithArray:
执行数组的浅表副本,这意味着不会复制单个对象。
答案 2 :(得分:2)
您也可以致电GoogleApiClient
答案 3 :(得分:-8)
在Objective-C“复制”关键字中只增加对象的“保留计数”。因此,只使用“复制”不会执行复制。
但是当我们在对象中进行更改时,Objective-C会在那时创建原始对象的副本。
如果我错了,请纠正我。
由于