我有一个NSMutableArray,我将其传递给tableViewController。用户将访问和更新阵列中的数据。添加对象并删除对象。
为了能够在用户与之交互之前返回到数组的状态,我想我会复制一个数组。这样,如果用户决定取消而不继续,我可以将copyArray传回原始数组。
但是,当我更新原始数组上的某些数据时,它也会在副本数组上更新。
不,我没有把它们分配给对方。我使用了以下代码。
array2 = [array1 copy];
我甚至尝试了那个长尾的。
NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:oldArray copyItems:YES];
但是如果我将copyItems设置为YES,则应用程序会因此错误而崩溃。
* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [SaleItem copyWithZone:]:无法识别的选择器发送到实例0xa21f3b0'
答案 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
的副本。