浅重复制数组后更改数组元素

时间:2011-04-16 13:20:25

标签: objective-c

在Objective C2中的编程书(Stephen Kochan)中,有以下数组:

NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:
    @"one, @"two", @"three", nil];

和另一个声明如下的数组:

NSMutableArray *arr2;

和浅色可变副本发生如下:

arr2 = [arr1 mutableCopy];

根据教科书,arr2现在拥有一个新数组,但对象引用arr1个对象不是数组中对象的真实副本。

这本书说,要改变arr2的第一个元素而不影响arr1的第一个元素,请写下以下几行:

NSMutableString *mStr = [NSMutableString stringWithString:[arr2 objectAtIndex:0]];
[mStr appendString: @"ONE"];
[arr2 replaceObjectAtIndex: 0 withObject: mStr];

任何人都可以解释为什么arr2的第一个元素只受影响而不影响arr1的第一个元素吗?

1 个答案:

答案 0 :(得分:2)

你有两个不同的数组。这就是答案:)。

详细说明:

  • arr1和arr2不同
  • 其中的元素是指向相同对象的指针

替换arr2的第一个对象时,不要覆盖前一个对象。并且因为两个数组都不相同(只有元素),所以替换只发生在arr2而不是arr1。

再次,更详细:

您需要了解数组是什么。它们只是指向对象的指针列表。在创建包含3个对象的数组时,您有一个包含3个指针的3个对象的数组。创建该数组的副本时,不要创建对象的副本,而是创建3个指针的副本。所以你的arr2将是一个不同的对象,它有自己的3个指针指向3个元素(obj1 .. obj3)。现在,当你执行replaceObjectAtIndex:withObject时,你只将arr2的指针与另一个指针交换(指向另一个obj(mStr)。因为两个数组(arr1和arr2)不是同一个对象(你创建了一个副本),这个只会影响arr2(再次:你只更改了arr2的指针 - 你根本没有改变obj1 !!)。

当你写[obj1 appendString:@"changed"]时,这会影响两个数组,因为两者都指向obj1。

希望这能让你更清楚!