2012-05-01 96 views
0

我有問題關於Objective-C的 「複製」,我在Car.m功能是這樣的:淺拷貝和深深的對象C複製

- (id) copyWithZone: (NSZone *) zone 
{ 
    Car *carCopy; 
    carCopy = [[[self class] allocWithZone: zone] init]; 

    carCopy.name = self.name; //not [name copy] 

    return (carCopy); 

} // copyWithZone 

的int的main.m:

Car *car = [[Car alloc] init]; 
    car.name = @"abc"; 

    Car *copyCar = [car copy]; 

    [copyCar print]; 

    car.name = @"123"; 

    [copyCar print]; 

爲屬性名稱,我認爲汽車和copyCar指向相同的NSString對象,以便當我做「car.name = @」123「」時,copyCar.name也應該改變。但是當我在代碼中打印兩次copyCar時,它們都將名稱打印爲「abc」。我想知道它爲什麼不是淺拷貝?

回答

0

您不會突變name屬性的字符串。你直接替換它。由於carcopyCar實際上不是同一個對象,因此分配給car.name不會影響copyCar.name

+0

謝謝!我明白。 – itenyh

3

兩件事情:

1)它們都可以開出指向同一個NSString的,但是當你做car.name = @"123",您正在做car.name點別的地方。您正在更改指針,而不是它指向的對象,並且更改car中的指針不會影響copyCar中的指針。如果你(假設)做了[car.name appendString:@"xxx"],會改變對象。但是,你不能,因爲

2)NSString s爲不可變的 - 你不能一旦它被創建

+0

謝謝!我明白。 – itenyh

0

兩個carcopyCar指向相同的字符串開始,但他們都改變的NSString對象有不同引用相同的字符串。如果您在一個對象中更改引用,它將不會影響另一個對象中的引用,所以這就是car可以指向新字符串但不指向carCopy的引用。