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

int 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を2回印刷すると、どちらも名前を「abc」として印刷します。なぜ浅いコピーではないのか知りたいですか?

4

3 に答える 3

3

2つのこと:

1) 両方とも同じ NSString を指している可能性がありますがcar.name = @"123"、そうすると、別の場所を指すようになりcar.nameます。ポインターが指すオブジェクトではなく、ポインターを変更しているため、 でポインターを変更しても のポインターにcarは影響しません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

と はどちらも最初は同じ文字列carを指していますが、どちらも同じ文字列への異なる参照を持っています。1 つのオブジェクトの参照を変更しても、他のオブジェクトの参照には影響しないため、新しい文字列を指すことができますが、.copyCarcarcarCopy

于 2012-05-01T02:34:16.257 に答える