深拷贝和浅拷贝

时间:2012-03-28 17:36:20

标签: iphone nsarray

我已经阅读了帖子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];是深拷贝。是不是?

4 个答案:

答案 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会在那时创建原始对象的副本。

如果我错了,请纠正我。

由于