2012-02-02 74 views
1

我想將兩個對象添加到我的數組,但是當我檢查數組時,第二個對象出現在列表中兩次。有誰知道爲什麼?填充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

您不會創建兩個人實例,而只是一個。

做這一點:

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變量仍然指向第一個人實例。您需要將該變量更改爲新實例,否則您只需插入該人員兩次,並覆蓋其屬性。

+0

我原本是這樣做的,但是你得到錯誤''''''重定義'' – Coderama 2012-02-02 21:11:26

+1

你可能忘記刪除第二行的'Person *'。 – Regexident 2012-02-02 21:14:25

+0

就是這樣!謝謝! – Coderama 2012-02-02 21:16:15

2

您只創建了一個人。試試這個:

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 2012-02-02 21:13:46

+0

我經常用'for'循環做這件事。看到我上面的編輯。 – bryanjclark 2012-02-02 21:18:52

3

的問題是,數組不會讓你傳遞給它添加對象的副本,而不是它僅包含對象的引用。所以你正在做的是創建一個對象,分配給它的屬性,給出對數組的引用,對同一個對象進行變異,然後再次向數組中添加相同的(但是是變異的)對象。

您需要每次都創建一個新的Person對象,而不是改變同一個對象。