我对objective-c中的“copy”有疑问,我在Car.m中的功能是这样的:
- (id) copyWithZone: (NSZone *) zone
{
Car *carCopy;
carCopy = [[[self class] allocWithZone: zone] init];
carCopy.name = self.name; //not [name copy]
return (carCopy);
} // copyWithZone
在main.m中:
Car *car = [[Car alloc] init];
car.name = @"abc";
Car *copyCar = [car copy];
[copyCar print];
car.name = @"123";
[copyCar print];
对于属性名称,我认为car和copyCar都指向相同的NSString对象,因此当我执行“car.name = @”123“”时,也应该更改copyCar.name。但是当我在代码中打印copyCar两次时,它们都将名称打印为“abc”。我想知道为什么它不是浅色副本?
答案 0 :(得分:3)
两件事:
1)他们可能都开始指向同一个NSString,但当你car.name = @"123"
时,你现在正在car.name
指向其他地方。您正在更改指针,而不是它指向的对象,更改car
中的指针不会影响copyCar
中的指针。如果你(假设)做了像[car.name appendString:@"xxx"]
那样的事情,会改变对象。但是,你不能,因为
2)NSString
是不可变的 - 一旦创建了NSString对象就无法更改
答案 1 :(得分:0)
您没有改变name
属性的字符串。你正在彻底取代它。由于car
和copyCar
实际上不是同一个对象,因此分配给car.name
不会影响copyCar.name
。
答案 2 :(得分:0)
car
和copyCar
最初都指向相同的字符串,但它们都具有对同一字符串的不同引用。如果更改一个对象中的引用,则不会影响另一个对象中的引用,因此car
可以指向新字符串而不是carCopy
。