【问题标题】:Difference between shallow and deep copy浅拷贝和深拷贝的区别
【发布时间】:2014-04-10 06:04:17
【问题描述】:

我一直试图通过以下链接了解深拷贝和浅拷贝之间的区别:Difference

我做了什么:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    tempArray=[[NSMutableArray alloc] initWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G", nil];
    shallowArray=[[NSMutableArray alloc] initWithArray:tempArray copyItems:NO];
    deepArray=[[NSMutableArray alloc] initWithArray:tempArray copyItems:YES];
}

- (IBAction)testShallowDeep:(id)sender {

    [tempArray removeObjectAtIndex:0];
    NSLog(@"ShallowArray should get changed==%@",shallowArray);
    NSLog(@"DeepArray should remain Same===%@'",deepArray);
}

但是,当我检查日志时,两者都与临时数组相同。任何人都可以用上面的例子来解释这个概念。根据我的理解,Shallow Array 应该改变并且 应从中删除元素“A”,并且深度数组应与临时数组相同。

【问题讨论】:

标签: objective-c


【解决方案1】:

所以你基本上在这里做的是创建三个数组,tempArrayshallowArray 指向相同的对象,deepArray 指向副本。

最初是这样的,在实例化数组之后:

tempArrayshallowArray 都指向同一个对象。但是数组本身是不同的对象!

之后

[tempArray removeObjectAtIndex:0]

情况是这样的:

您似乎怀疑的行为可以通过让shallowArray 指向与tempArray 相同的对象来实现:

shallowArray = tempArray;

【讨论】:

  • 嘿fguchelaar!感谢您以如此好的方式解释。它解决了我的问题。
【解决方案2】:

你是对的,你在这里使用的代码应该和你上面所说的一样。但是我发现可能导致问题的事情是这个方法返回一个新分配的数组,并且数组中的每个对象都会收到一个copyWithZone: 消息。声明的第一部分很适合在这里讨论您的问题,因为每个数组都有自己的内存,同时Apple doc说这应该在这里有一个浅拷贝(你在上面给出的链接)。恐怕您在这里使用 ARC,而 ARC copyWithZone: 不可用。这可能会阻止数组在这里进行浅拷贝。这意味着新阵列没有获得旧阵列的区域。如果这些情况都不是;然后有人必须向Apple提交报告以澄清此类事情。

编辑:

您的问题的答案在这里。这里一切正常。是的,这里是浅拷贝。但是我在这里注意到的一件事深拷贝也指向相同的内存位置,浅内存位置和临时内存位置都是。在你的场景中。 temparry 的第一个对象的内存位置为 0x13df19。浅拷贝也是如此。 deeparray 肯定是不同的,但坐在我身边是一样的。问题来了,当您从临时数组中删除对象时。对象地址被删除。根据文档,浅数组和临时数组的对象都指向相同的位置。并不是说整个数组都是一样的。因此,当您从临时数组中删除对象时,它会被删除,但该对象将在内存中,并将驻留在已添加的每个数组中。你说的场景应该是这样的

someArray = tempArray;
[tempArray removeObjectAtIndex:0];
NSLog(@"Updated Array should get changed==%@",someArray);

现在这将具有与 temp 数组相同的数组,因为它们指向相同的内存位置。

【讨论】:

  • 嗨,萨阿德,是的!我正在使用ARC ...这个问题是否与ARC有关?我也检查过没有ARC。结果相似:-(
  • 是的,它可能会导致问题。但抓住了你的问题。查看更新的答案
猜你喜欢
  • 2016-05-07
  • 2010-09-16
  • 2012-04-12
  • 2015-01-13
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多