2016-06-17 7 views
0
NSMutableArray *array = [[NSMutableArray alloc] init]; 
[array addObject:@"1"]; 
NSString *test = array[0]; 
test = @"2"; 
NSLog(@"%@", array[0]); //Output is 1 

array[0] = @"2"; 
NSLog(@"%@", array[0]); //Output is 2 

What's going on?なぜ最初のケースで出力が1ですか? NSMutableArratはオブジェクトへのリンクを保持しませんか?NSMutableArray内の値を変更する

+0

ポインタの世界へようこそ。なぜあなたは混乱しているのですか?スウィフトからここに来ましたか? –

答えて

2

What's going on?

testarray[0]はあなたが行うのと同じオブジェクトを指す異なるオブジェクト参照です:

test = @"2"; 
:あなたは別のオブジェクトを指すように test @"2"に割り当てる

NSString *test = array[0]; 

array[0]にオブジェクト参照を変更しないでください:

array[0] = @"2"; 
0

はい、しかし、NSStringのは変更できません、あなたはちょうどそれが価値だ変更されていません。あなたがこれを行うとき:

test = @"2"; 

新しい価値@"2"

で新しいポインタを作成し、今から

array[0]は別のポインタです。あなたの配列に追加したポインタと同じではありません。

あなたがよりよく理解するために、これを試すことができます。

NSMutableString* test = [[NSMutableString alloc] initWithString:@"1"]; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 
[array addObject: test]; 

NSLog(@"test 1: %@", array[0]); //Output is 1 
[test setString:@"2"]; 
NSLog(@"test 2: %@", array[0]); //Output is 2 
1

あなたの配列を定義し、それへのあなたの最初の要素を追加する場合:

Storage after adding the first element to it

NSMutableArray *array = [[NSMutableArray alloc] init]; 
[array addObject:@"1"]; 

をお使いのストレージは、次のようになります

このような変数NSStringを定義すると、

NSString *test = array[0]; 

最初の配列要素を指すtestのポインタを作成します。ただし、ではありません。それはそれを指すだけです。

test = @"2"; 

Storage after defining and assigning the test string pointer

あなたtestポインタポイントは、文字列@"2"にしましょう。したがって、単に文字列ポインタに新しい値(アドレス)を割り当てるだけです。

Storage after modifying the test string pointer

したがって、この行の後testはもう、配列については何も知らないし、配列要素は、この行によって変更されることはありません。

0

あなたが必要とするコードがあります:

NSArray *array = @[[@"1" mutableCopy]]; 
NSMutableString *test = array[0]; 
[test setString:@"2"]; 
NSLog(@"%@", array[0]); //Output is 2 

ので、それが起こるのです。

test = @"2" 

は、新しいオブジェクトを作成し、それを変数testへのポインタです割り当てるが、arrayはまだ古いオブジェクトにポインタを持っている、あなたはまだそれを変更していない。

私のコードでは、配列内に格納されている同じオブジェクトを使用して値を変更するため、arrayにも変更されています。

関連する問題