繁体   English   中英

深拷贝和浅拷贝

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM