填充NSMutableArray时重复

时间:2012-02-02 20:53:43

标签: objective-c 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 个答案:

答案 0 :(得分: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变量仍然指向第一个人实例。您需要将变量更改为新实例,否则您只需插入此人两次并覆盖其属性。

答案 1 :(得分:3)

问题是数组不会复制传递给它的对象,而是只保存对象的引用。所以你要做的就是创建一个对象,分配它的属性,给出对数组的引用,改变同一个对象,然后再将相同的(但是已经变异的)对象添加到数组中。

每次都需要创建一个新的Person对象,而不是改变同一个对象。

答案 2 :(得分: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];

这里的问题是,当你将第一个人添加到数组中,然后修改了原始对象时,对象也会在数组中被修改---你需要实例化一个新版本的“person”对象和修改它。

如果你想创建很多人,我建议使用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];
}