このトピックに関するいくつかの議論を見つけましたが、それは私の現在の理解レベルを超えていました. Kochan の「Objective-C、4e でのプログラミング」を読んでいて、NSString オブジェクトに関するセクションにいます。まず、私が遊んでいるコードで、質問をすることができます:
NSString *strA = @"StringA";
NSString *strB = @"StringB";
NSLog(@"Value of strA: %@",strA);
NSLog(@"Value of strB: %@",strB);
strB = strA; // strB should point to strA's memory location
NSLog(@"New value of strB: %@",strB); //correctly logs as "StringA"
strA = @"StringA has been changed.";
NSLog(@"New value of strB: %@",strB); //logs as "StringA" still
NSLog(@"New value of strA: %@",strA); //correctly logs as "StringA has been changed"
私の理解では、strB = strA と言うことは、strB が strA のメモリ位置を指していることを意味するため、strA への変更はすべて strB にも適用されます。ただし、これは起こりません。Kochanはそれが想定されていると言い、それを回避するには使用することを提案します
strB = [NSString stringWithString: strA];
私が見る限り、どちらの方法でも機能します。strB = strA と言ってから strA を変更しても、strB は受け取った値 (変更する前の strA の値) を保持しています。
これは NSString が不変であることに起因するのではないかと思っていましたが、そうであれば、実際に初期化後に str1 と str2 の値を変更できるのはなぜですか? ここで何が欠けていますか?ありがとう。