在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的第一个元素吗?
答案 0 :(得分:2)
你有两个不同的数组。这就是答案:)。
详细说明:
替换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。
希望这能让你更清楚!