2

私の子View Controllerには、次のように定義されたプロパティがあります。

@property (nonatomic, copy) NSString *name;

親であるView Controller Aには、次のものがあります。

NSString *temp = currency.name; //This is because currency is a Core Data Managed Object.
                                //I wanted to make sure it wasn't a confounding factor.

childViewController.name = temp;

if(childViewController.name == temp)
  NSLog(@"I am surprised");

問題は、ifステートメントが同等性を見つけ、「私は驚いています」が出力されることです。==それらが同じオブジェクトであるかどうかを確認する必要がありcopy、プロパティ宣言で を使用することで、セッターがコピーを作成していることを確認する必要があると思いました。デバッガーでチェックインしたところ、両方とも同じ文字列を指しています。(これは不変であると私は信じています。なぜこれが起こっているのでしょうか?)

と書いても同じことが起きてchildViewController.name = [temp copy];ビックリ!

ここで何が起こっているのか誰でも説明できますか?

編集:循環参照について心配することについてここで少し削除しましたが、問題ではないことに気付きました。

4

1 に答える 1

0

これは最適化です。

不変オブジェクトの場合、実際のコピーを作成するのは不要なので- copy、単純な保持として実装されることがよくあります。

- (id)copy
{
    [self retain];
    return self;
}

変更可能なオブジェクト ( などNSMutableString) をプロパティに割り当ててみると、「期待される」動作が得られます。

于 2013-10-28T05:44:48.467 に答える