2012-02-02 12 views
1

配列に2つのオブジェクトを追加しようとしていますが、配列を検査するときに2番目のオブジェクトがリストに2回表示されます。なぜ誰が知っていますか?NSMutableArrayを作成するときに複製が発生する

list = [[NSMutableArray alloc] init]; 
Person *person = [[Person alloc] init]; 

// Create person 1 
person.name = @"Fred"; 
person.gender = @"unknown"; 

// Append to array 
[list addObject:person]; 
[person release]; 

// Create person 2 
person.name = @"Bob"; 
person.gender = @"male"; 

// Append to array again 
[list addObject:person]; 
[person release]; 

答えて

3

2人のインスタンスを作成するのではなく、1つだけ作成します。

list = [[NSMutableArray alloc] init]; 
Person *person; 

// Create person 1 
person = [[Person alloc] init]; 
person.name = @"Fred"; 
person.gender = @"unknown"; 

// Append to array 
[list addObject:person]; 
[person release]; 

// Create person 2 
person = [[Person alloc] init]; //this line right here! 
person.name = @"Bob"; 
person.gender = @"male"; 

// Append to array again 
[list addObject:person]; 
[person release]; 

を又は第二の変数に二人目を割り当てる:

のどちらかがこれを行います。

person変数は、最初の人物インスタンスを依然として指しています。変数を新しいインスタンスに変更する必要があります。そうでない場合は、単にその人物を2回挿入し、そのプロパティを上書きします。

+0

私はもともとこれを行いましたが、 '' redefinition 'person''のエラーを受け取ります。 – Coderama

+1

2行目の 'Person *'を削除するのを忘れたのでしょう。 – Regexident

+0

それはそれでした!ありがとう! – Coderama

2

あなたは1人しか作成していません。このお試しください:ここでの問題

list = [[NSMutableArray alloc] init]; 
Person *person = [[Person alloc] init]; 

// Create person 1 
person.name = @"Fred"; 
person.gender = @"unknown"; 

// Append to array 
[list addObject:person]; 
[person release]; 

// Create person 2 
Person *person2 = [[Person alloc] init]; 
person2.name = @"Bob"; 
person2.gender = @"male"; 

// Append to array again 
[list addObject:person2]; 
[person release]; 

を新しいバージョンをインスタンス化する必要がある元のオブジェクトを変更するときに、配列に最初の人を加えた後、オブジェクトはまた---配列に変更されていることです「人物」オブジェクトの名前を変更して変更します。あなたは多くの、多くの人々を作成したい場合は

、私はforループを使用することをお勧め:

NSArray *names = [NSArray arrayWithObjects:@"Fred", @"Bob"]; 
NSArray *genders = [NSArray arrayWithObjects:@"unknown", @"male"]; 

for (int i = 0; i<[names count]; i++) { 
    Person *person = [[Person alloc] init]; 
    person.name = [names objectAtIndex:i]; 
    person.gender = [genders objectAtIndex:i]; 
    [list addObject:person]; 
    [person release]; 
} 
+0

これは動作しますが、person変数を再利用(再初期化)して、異なる 'Person'変数を作成する必要はありません。 – Coderama

+0

私はこれを 'for'ループで行うことがよくあります。上記の私の編集を参照してください。 – bryanjclark

3

問題は、配列ではなく、あなたが追加することに渡されたオブジェクトのコピーを作成していないということですオブジェクトへの参照のみを保持します。つまり、オブジェクトの作成、プロパティへの割り当て、配列への参照、同じオブジェクトへの変更、そして同じ(しかし突然変異した)オブジェクトの配列への追加です。

同じオブジェクトに変更するのではなく、新しいPersonオブジェクトを毎回作成する必要があります。

関連する問題