s1 と s2 のメモリ アドレスは同じになりますか?
はいの場合、なぜですか?
両方の文字列が変更可能な場合はどうなりますか?
NSString *s1 = @"Hello";
NSString *s2 = [[NSString alloc]initWithString:@"Hello"];
s1 と s2 のメモリ アドレスは同じになりますか?
はいの場合、なぜですか?
両方の文字列が変更可能な場合はどうなりますか?
NSString *s1 = @"Hello";
NSString *s2 = [[NSString alloc]initWithString:@"Hello"];
s1 と s2 のメモリ アドレスは同じになりますか?
おそらく -- 実装は Foundation によって定義されます。
はいの場合、なぜですか?
実装は、コピーを作成する必要がない場合にパラメーターを返す場合があります。入力パラメーターが不変の場合、要求したオブジェクトは入力パラメーターと同じように動作しますNSString
。行ったように不滅のリテラルを渡すNSString
と、実装はパラメーターが不変であると簡単に判断し、パラメーター ( retained
) を返すことを選択できます。
もちろん、これはライブラリ (Foundation) が認識してサポートする必要がある最適化です。
実装の詳細が異なるため、実装が入力パラメーターを返さないことを選択する可能性もあります。一例として、文字列が外部所有の文字バッファを使用して作成された場合、実装は新しい文字列を返すことがあります。また、パラメーターが可変であることを認識する場合もあります。その場合、もちろん、新しい不変オブジェクト表現を返す必要があります。
両方の文字列が変更可能な場合はどうなりますか?
その場合、ディープ コピーの可能性が高くなります。実装は Foundation によって定義されます。ただし、一意のインスタンスがあります (それらのアドレスは一致しません)。