[英]Deep Copy and Shallow Copy
我已经阅读了帖子中深拷贝和浅拷贝之间差异的答案,深拷贝和浅拷贝有什么区别? 。 现在我有点怀疑当我们做了一个浅的副本
newArray = [NSmutableArray arrayWithArray:oldArray];
新数组将指向oldArray。 (如图所示)。 现在当我从newArray中删除对象时会发生什么? 如图所示,它应该从oldArray中移除相同的元素! 这好像是
newArray = oldArray
是浅拷贝而newArray = [NSmutableArray arrayWithArray:oldArray];
是深刻的副本。 这样对吗?
newArary = oldArray
根本不是副本。 你最终得到两个指向完全相同内存位置的指针。
newArray = [NSMutableArray arrayWithArray:oldArray];
是一个浅薄的副本。 最终得到两个不同的数组,因此如果要从一个数组中删除或添加项,则不会影响另一个数组。 但是,两个数组中的项目是相同的。 如果oldArray
的第一个元素是NSMutableDictionary
并且你为它添加了一个键,那么你也会看到newArray
的第一个元素的变化(因为这两个对象是相同的)。
要进行深层复制,您必须创建一个新数组,新数组的每个元素都将是旧数组的相应元素的深层副本。 (是的,该定义是递归的)。
首先, 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:
执行数组的浅表副本,这意味着不会复制单个对象。
你也可以调用[[NSArray alloc] initWithArray:arraytoBeCopied copyItems:YES];
在Objective-C“复制”关键字中,只需增加对象的“保留计数”即可。 因此,只使用“复制”不会执行复制。
但是当我们对对象进行更改时,Objective-C会在那时创建原始对象的副本。
如果我错了,请纠正我。
谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.