所以我发现addObject的一个问题,而不是在数组的末尾附加一个值,它只是放入我正在添加的对象的内存位置(我反复使用它)。最终结果是数组中的所有值最终完全相同,这是最后一个条目。显然,我不想要这个。
如何向数组添加唯一对象?这是我添加对象的代码......
[listArray addObject:customer];
listArray是一个MSMutable数组。客户是一个有4个值的类。
我在这里发现了同样的问题 addObject creates a same value in all array
但是那个解决方案给了我一个错误'线程1:编程接收信号:“SIGABRT”。
我使用代码创建客户对象..
else if ([elementName isEqualToString:@"CustomerListResponse"]) {
NSLog(@"customer element found – create a new instance of Customer class...");
customer = [[CustomerListData alloc] init];
}
感谢。
答案 0 :(得分:5)
首先应该让客户对象实现NSCopying协议。然后,您可以执行以下操作:
[listArray addObject:[[customer copy] autorelease]];
这将确保将 new 对象添加到数组中,而不仅仅是指向您不断重用的现有对象的指针。
请注意,您必须自动发布此副本,因为copy
方法返回一个保留计数为1的新对象。
答案 1 :(得分:2)
我猜这里有点因为你没有给我们足够的代码。
如果你这样做:
Customer customer = [[Customer alloc] init];
[customer setProperty1: @"foo1"];
[customer setProperty2: @"foo2"];
[customer setProperty3: @"foo3"];
[customer setProperty4: @"foo4"];
[listArray addObject: customer];
[customer setProperty1: @"bar1"];
[customer setProperty2: @"bar2"];
[customer setProperty3: @"bar3"];
[customer setProperty4: @"bar4"];
[listArray addObject: customer];
[customer release];
你会得到你描述的症状。 customer
第二次指向同一个对象。您刚刚更改了它的属性,并且可变数组现在将在两个槽中包含相同的对象(使用第二组值)。
如果你这样做
Customer customer = [[Customer alloc] init];
[customer setProperty1: @"foo1"];
[customer setProperty2: @"foo2"];
[customer setProperty3: @"foo3"];
[customer setProperty4: @"foo4"];
[listArray addObject: customer];
[customer release];
customer = [[Customer alloc] init];
[customer setProperty1: @"bar1"];
[customer setProperty2: @"bar2"];
[customer setProperty3: @"bar3"];
[customer setProperty4: @"bar4"];
[listArray addObject: customer];
[customer release];
我保证您将获得两个具有阵列所需属性的不同对象。如果你认为你这样做,那你错了。发布代码,我们会告诉你错误在哪里。
答案 2 :(得分:1)
如果您使用ARC,请尝试:
CustomerListData *newcustomer = [[CustomerListData alloc] init];
newcustomer = [customer copy];
[listArray addObject:newcustomer];