没有做到我预期的NSArray的副本

时间:2014-05-12 21:54:13

标签: ios objective-c arrays

我有一个NSMutableArray,我将其传递给tableViewController。用户将访问和更新阵列中的数据。添加对象并删除对象。

为了能够在用户与之交互之前返回到数组的状态,我想我会复制一个数组。这样,如果用户决定取消而不继续,我可以将copyArray传回原始数组。

但是,当我更新原始数组上的某些数据时,它也会在副本数组上更新。

不,我没有把它们分配给对方。我使用了以下代码。

array2 = [array1 copy];

我甚至尝试了那个长尾的。

NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:oldArray copyItems:YES];

但是如果我将copyItems设置为YES,则应用程序会因此错误而崩溃。

  

* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [SaleItem copyWithZone:]:无法识别的选择器发送到实例0xa21f3b0'

2 个答案:

答案 0 :(得分:8)

您应该查看数组的深拷贝和浅拷贝之间的区别。简而言之,您只想要数据结构的副本,还是想要数组中的项目副本? (原件和副本是否应指向相同的对象?)

解决此错误:

  
      
  • 由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [SaleItem copyWithZone:]:无法识别的选择器发送到实例0xa21f3b0'
  •   

您还需要SaleItem课程中的implement NSCopying

答案 1 :(得分:6)

制作"副本" NSArray(或init来自旧数组的新数组)只会为您提供一个新数组,其中包含指向与第一个数组相同的对象的指针,而不是这些对象的副本。根据{{​​3}},您可以使用:

NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:oldArray copyItems:YES];

获取复制的第一级项目(假设它们实现an answer to another question on Stack Overflow),但这可能会或可能不足以满足您的目的,具体取决于这些对象是什么。 NSCopying有更多关于制作" deep" NSArray的副本。