数组addObject正在更改所有数组值而不是仅添加

时间:2012-01-03 15:17:16

标签: iphone objective-c ios xcode

所以我发现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];
      }

感谢。

3 个答案:

答案 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];