我对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);
} // copyWithZoneint 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“。我想知道为什么它不是浅拷贝?
发布于 2012-05-01 10:28:41
两件事:
1)它们可能都指向相同的NSString,但当您执行car.name = @"123"时,您现在正在使car.name指向其他地方。您要更改的是指针,而不是指针所指向的对象,并且在car中更改指针不会影响copyCar中的指针。如果你(假设)做了像[car.name appendString:@"xxx"]这样的事情,就会改变对象。但是,你不能,因为
2) NSString是不可变的--一旦创建了NSString对象,就不能再更改它
发布于 2012-05-01 10:25:29
您没有为name属性改变字符串。你要把它彻底替换掉。由于car和copyCar实际上不是同一个对象,因此为car.name赋值不可能影响copyCar.name。
发布于 2012-05-01 10:34:16
car和copyCar最初都指向相同的字符串,但它们对同一字符串的引用不同。如果更改一个对象中的引用,则不会影响另一个对象中的引用,因此这就是car可以指向新字符串而不是carCopy的原因。
https://stackoverflow.com/questions/10392809
复制相似问题