对象 C 中的浅拷贝和深拷贝



我对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 属性的字符串。你正在直接替换它。由于carcopyCar实际上不是同一个对象,因此分配给car.name不可能影响copyCar.name

carcopyCar 最初都指向同一个字符串,但它们对同一字符串都有不同的引用。如果您更改一个对象中的引用,它不会影响另一个对象中的引用,因此这就是car可以指向新字符串而不是carCopy的方式。

最新更新