なぜ変数はとても奇妙に振る舞うのですか?
-
03-07-2019 - |
質問
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の配列)を出力します。
変数はコンテナです。割り当ては、右側にあるものをすべて取り、左側にあるものにも入れます。つまり、ある変数から別の変数に値をコピーします。この場合、それらの値はポインター(メモリアドレス)です。
だからあなたがやったことは次のとおりです:
-
str2
変数にあるアドレスを取得し、test
変数に同じアドレスを入力します。 -
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:
を使用してください。