0

我对objective-c中的“复制”有疑问,我在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”。我想知道为什么它不是浅拷贝?

4

3 回答 3

3

两件事情:

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

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

于 2012-05-01T02:28:41.197 回答
0

您没有改变name属性的字符串。你直接换掉。因为carcopyCar实际上不是同一个对象,所以分配给car.name不可能影响copyCar.name.

于 2012-05-01T02:25:29.317 回答
0

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

于 2012-05-01T02:34:16.257 回答