objective-c中的浅拷贝和深度复制

时间:2012-05-01 02:22:15

标签: iphone objective-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

在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”。我想知道为什么它不是浅色副本?

3 个答案:

答案 0 :(得分:3)

两件事:

1)他们可能都开始指向同一个NSString,但当你car.name = @"123"时,你现在正在car.name指向其他地方。您正在更改指针,而不是它指向的对象,更改car中的指针不会影响copyCar中的指针。如果你(假设)做了像[car.name appendString:@"xxx"]那样的事情,会改变对象。但是,你不能,因为

2)NSString是不可变的 - 一旦创建了NSString对象就无法更改

答案 1 :(得分:0)

您没有改变name属性的字符串。你正在彻底取代它。由于carcopyCar实际上不是同一个对象,因此分配给car.name不会影响copyCar.name

答案 2 :(得分:0)

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