Iphone Array addObject正在更改所有数组值,而不仅仅是追加

Iphone Array addObject正在更改所有数组值,而不仅仅是追加,iphone,objective-c,ios,xcode,Iphone,Objective C,Ios,Xcode,因此,我发现addObject存在一个问题,它不是在数组末尾追加一个值,而是将我正在添加的对象的内存位置放进去,我正在反复使用它。最终的结果是数组中的所有值都完全相同,这与最后一个条目是什么完全相同。显然,我不想要这个 如何将唯一对象添加到阵列中?这是我添加对象的代码 [listArray addObject:customer]; listArray是一个MSMutable数组。Customer是一个具有4个值的类 我在这里发现了同样的问题 但该解决方案给了我一个错误“线程1:程序

因此,我发现addObject存在一个问题,它不是在数组末尾追加一个值,而是将我正在添加的对象的内存位置放进去,我正在反复使用它。最终的结果是数组中的所有值都完全相同,这与最后一个条目是什么完全相同。显然,我不想要这个

如何将唯一对象添加到阵列中?这是我添加对象的代码

     [listArray addObject:customer];
listArray是一个MSMutable数组。Customer是一个具有4个值的类

我在这里发现了同样的问题

但该解决方案给了我一个错误“线程1:程序接收信号:SIGABRT”

我使用代码创建customer对象

      else if ([elementName isEqualToString:@"CustomerListResponse"]) {
         NSLog(@"customer element found – create a new instance of Customer class...");
         customer = [[CustomerListData alloc] init];
      }

谢谢。

您首先应该让您的客户对象实现该协议。然后,您可以执行以下操作:

[listArray addObject:[[customer copy] autorelease]];
这将确保向数组中添加一个新对象,而不仅仅是指向不断重用的现有对象的指针


请注意,您必须自动释放此副本,因为copy方法返回一个保留计数为1的新对象。

我在这里猜测一下,因为您没有为我们提供足够的代码

如果您正在这样做:

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

我保证您将获得两个具有阵列中所需属性的不同对象。如果你认为你在这样做,那你就错了。把密码贴出来,我们会告诉你错误在哪里

如果您正在使用ARC,请尝试:

CustomerListData *newcustomer = [[CustomerListData alloc] init];
newcustomer = [customer copy];
[listArray addObject:newcustomer];

请包含有关addObject:语句的更多代码。你是如何使用这个变量的?不知道我还能添加什么相关的。在我的方法中只有那一行。我正在解析一个包含多个客户值的XML。我正在将数据解析到类中,然后尝试将该类插入数组中。然后,解析XML中的下一个客户值,覆盖同一类中的所有旧客户值,然后尝试将新客户存储到数组中。问题是addObject只是一次又一次地存储客户类的内存目标,而不是实际存储一个新类。这只是一个效率的事情,我理解,但我需要绕开它。我几乎用这个教程来逐字解析,如果它有帮助的话。。。您并没有一字不差地使用它,该教程每次都会创建一个新对象,并在添加到数组后将其释放-您没有这样做,这是您的问题。您需要添加到问题中的相关代码是创建客户对象的代码。我在创建客户对象的地方发布了代码。我认为问题可能是在XML中创建新的customer类时。我在开始处理所有客户时就这样做,而不是在XML访问单个客户时。让我试试。这可能会有点帮助,但它并没有触及问题的根源。仅供参考,自动释放会对新xcode抛出错误。据他们说,他们显然是为你处理的now@JeremyP这个答案确实解决了问题的根源。他说,他在指向同一内存块的同一个指针上反复使用同一个客户对象。通过一次又一次地将同一个对象添加到数组中,他最终得到一个长度为N的数组,其中包含许多指向完全相同对象的指针。在添加对象之前复制该对象将解决他的问题,这是一种完全可以接受的方式。@JesseDurham如果使用ARC,这是正确的。如果您使用的是ARC,您可能应该在问题中指定它。还不是每个人都在使用它。如果您使用的是ARC,您可以安全地添加副本,而无需自动删除。从技术上讲,您俩都是对的,这取决于我想如何修复它。。但塞巴斯蒂安更直接地回答了最初的问题。Jeremy提供了另一种解决方案。这也适用于自定义init吗?我收到以下错误:NSInvalidArgumentException',原因:'-[Timesheet copyWithZone:]:发送到实例0xc7794d0的选择器无法识别。我看不出自定义初始化会如何影响此操作。基本上,我建议在一个新的内存空间中使用copy创建一个新对象,而不是仅仅添加一个指向内存空间的指针,而这个内存空间在OP场景发生变化时可能会发生变化。即使在新对象中使用自定义init,它仍然应该被分配,所以应该可以。确保在自定义init中调用super(如果合适):self=[super init];