-4

重複の可能性:
これら 2 つの NSString ポインターが同じなのはなぜですか?

s1 と s2 のメモリ アドレスは同じになりますか?

はいの場合、なぜですか?

両方の文字列が変更可能な場合はどうなりますか?

NSString *s1 = @"Hello";

NSString *s2 = [[NSString alloc]initWithString:@"Hello"];
4

1 に答える 1

2

s1 と s2 のメモリ アドレスは同じになりますか?

おそらく -- 実装は Foundation によって定義されます。

はいの場合、なぜですか?

実装は、コピーを作成する必要がない場合にパラメーターを返す場合があります。入力パラメーターが不変の場合、要求したオブジェクトは入力パラメーターと同じように動作しますNSString。行ったように不滅のリテラルを渡すNSStringと、実装はパラメーターが不変であると簡単に判断し、パラメーター ( retained) を返すことを選択できます。

もちろん、これはライブラリ (Foundation) が認識してサポートする必要がある最適化です。

実装の詳細が異なるため、実装が入力パラメーターを返さないことを選択する可能性もあります。一例として、文字列が外部所有の文字バッファを使用して作成された場合、実装は新しい文字列を返すことがあります。また、パラメーターが可変であることを認識する場合もあります。その場合、もちろん、新しい不変オブジェクト表現を返す必要があります。

両方の文字列が変更可能な場合はどうなりますか?

その場合、ディープ コピーの可能性が高くなります。実装は Foundation によって定義されます。ただし、一意のインスタンスがあります (それらのアドレスは一致しません)。

于 2012-08-11T19:22:34.573 に答える