我正在尝试向我的数组中添加两个对象但是当我检查数组时,第二个对象会在列表中出现两次。有谁知道为什么?
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];
答案 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];
}