質問

objective-cの変数は、メモリ内のオブジェクトへの単なる参照であると考えました。したがって、最後にオブジェクトのメモリアドレスstr1をstr2に割り当てるため、結果は「1」である必要があります。以前は、str2のメモリアドレスをテストに割り当てていました。

NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];

test = str2; // test is an instance variable. I use no getter/setter here! just for testing!
str2 = str1;
NSLog(test); // = "two" ??
役に立ちましたか?

解決

これがポインターの仕組みです。表示される結果は正常で正しいです。

すべての変数と、宣言されたときにメモリ内でそれらが指す文字列をリストしましょう:

str1 -> "One"
str2 -> "Two"

次に、いくつかの割り当て手順を実行します。

test = str2;

これにより、ポインター str2 の値が test に割り当てられます。ポインタは次のとおりです

str1 -> "One"
str2 -> "Two"
test -> "Two"

その後

str2 = str1;

ポインター str1 の値を str2 に割り当てます。ポインタは次のとおりです

str1 -> "One"
str2 -> "One"
test -> "Two"

次に、 test を印刷します。これは、元々 str2 が指していたものを指し、これは" Two"です。

str2 str1 の値に割り当て、 test str2 <の値に割り当てたため、 / code>、 str1 の値が何らかの形で test にカスケードされること。これはそうではありません。 test の値が割り当てられると、その値がどこから来たかに関する情報は失われます。 test の値を str1 の値と同じにしたい場合は、割り当て操作の順序を逆にする必要があります。

str2 = str1;
test = str2;

他のヒント

これがあります:

test = str2; // test is an instance variable.testing!
str2 = str1;
NSLog(test); // = "two" ??

さて、これらの変数がすべてintであるふりをしましょう。

最初の行では、変数 test が変数 str2 の値に設定されます。 2行目では、変数 str2 が変数 str1 の値に設定されます。 3行目では、 test の値を出力します。実際には、 str2 をテストに割り当てたときの str2 の値です。 後で str2 に別の値を割り当てたことはまったく問題ではありません。

わかりましたが、変数は実際にはポインタであり、intではありません。

関係なく:ポインターを単なる数字、メモリー内のどこかのアドレスと考えてください。 NSLogをNSLogに渡すと、NSLogはポインターの値ではなく、ポインターが指す値(charの配列)を出力します。

変数はコンテナです。割り当ては、右側にあるものをすべて取り、左側にあるものにも入れます。つまり、ある変数から別の変数に値をコピーします。この場合、それらの値はポインター(メモリアドレス)です。

だからあなたがやったことは次のとおりです:

  1. str2 変数にあるアドレスを取得し、 test 変数に同じアドレスを入力します。
  2. str1 変数にあるアドレスを取得し、 str2 変数に同じアドレスを入力します。

ステップ2は、 test 変数には影響しません。その変数への唯一の割り当てはステップ1でした。

重要:アドレスのコピーは行っていません 。あなたはアドレス自体をコピーしています。まだ1つだけあります&#8220; 2つ&#8221;文字列ですが、ステップ1と2の間で、そのオブジェクトのアドレス str2 test の両方にあります。次に、ステップ2で、 str2 のアドレスを&#8220; one&#8221;のアドレスに置き換えます。 str1 にも存在し、&#8220; two&#8221;のアドレスを保持する唯一の変数として test を残します。文字列。

BTW、 stringWithCString:は非推奨です。代わりに stringWithUTF8String:または stringWithCString:encoding:を使用してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top