インスタンス変数の動作がおかしいのはなぜですか?私はそれを正しくしましたか?
-
03-07-2019 - |
質問
いくつかのポインターを試すために、既存のプロジェクトでインスタンス変数を作成しました。次のように宣言されています:
@interface PointerFun : NSObject {
NSString* test;
}
@propertyコンパイラディレクティブ、@ synthesizeがないため、ゲッターとセッターはありません。テスト用。
次に、ポインターとこのインスタンス変数を使用していくつかのことを試すメソッドがあります。私が実際にチェックアウトしたかったのは、そのインスタンス変数にNSStringオブジェクト(または任意のオブジェクト)を割り当て、オブジェクトを割り当てた後、インスタンス変数に割り当てたポインターに別のオブジェクトを割り当てたときに何が起こるかです。インスタンス変数のオブジェクトをweellとして変更すると思いました。
つまり、ここに私のコードがあります:
NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];
test = str2; // assign directly to instance variable (bad thing, just for testing!)
str2 = str1; // now lets be really mean and change the object from that pointer!!
NSLog(@"test: %x, %@", test, test); // test: 52cb10, two
NSLog(@"str1: %x, %@", str1, str1); // str1: 52ca60, one
NSLog(@"str2: %x, %@", str2, str2); // str2: 52ca60, one
ご覧のように、インスタンス変数はstr2の初期のNSStringオブジェクトを指し続けています。そのため、str1をstr2に割り当てたときに、str1の値をメモリアドレスであるstr2に割り当てました。両方のポインターに同じ値を設定しましたよね?
しかし、str2の値をtestに割り当てたとき、testはstr2から値を引き継ぎました。これは、その時点では「2」のメモリアドレスでした。オブジェクト。そのため、ポインタstr2の値をその割り当て後に変更しても、インスタンス変数の値には影響しません。 NSStringオブジェクトへのポインタであるため、str1またはstr2であるかのように動作します。インスタンス変数だからといって違いはありません。それは単なる変数、またはそれ以上です。それは単なるポインタです。私はそれを正しくしましたか?ふう;)...そう願っています!
解決
3つの変数は実際にはポインター(test、str1、str2)であり、2つのオブジェクトが作成されています:" one"および" two"。
行うとき:
test = str2;
オブジェクト" two"のテストポイントを作成します。実行すると:
str2 = str1;
str2がオブジェクト「1つ」をポイントしているため、テストにはまったく影響しません。