2012-02-02 70 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对象,而不是改变同一个对象。