我对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
int the 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"。我想知道为什么它不是一个浅拷贝?
两件事:
1)它们可能都开始指向相同的NSString,但是当你car.name = @"123"
时,你现在在其他地方提出car.name
点。您正在更改指针,而不是它指向的对象,并且更改 car
中的指针不会影响 copyCar
中的指针。如果你(假设)做了类似[car.name appendString:@"xxx"]
的事情,那会改变对象。但是,你不能,因为
2) NSString
是不可变的 - 一旦创建了 NSString 对象,就无法更改它
您不会改变 name
属性的字符串。你正在直接替换它。由于car
和copyCar
实际上不是同一个对象,因此分配给car.name
不可能影响copyCar.name
。
car
和 copyCar
最初都指向同一个字符串,但它们对同一字符串都有不同的引用。如果您更改一个对象中的引用,它不会影响另一个对象中的引用,因此这就是car
可以指向新字符串而不是carCopy
的方式。