如何创建NSArray副本并在不影响原始NSArray的情况下进行更改?

new2ios

我需要一份副本NSArray来存储日期状态。我尝试使用mytableCopy我了解的使副本与原始对象无关的副本。

当我进行更改mutableCopy时,原始数组中也会发生更改。

为什么?

我的代码是:

_nsarr = [[NSArray alloc] initWithArray:inputArray];
_nsMraa= [NSMutableArray alloc];
_nsMraa = [_nsarr mutableCopy];

注意:这两个数组都是我对象的属性。inputArray是输入参数,此后不使用。

备注:一个对象是NSArray,另一个是NSMutableArray

戴维·贝里

正如巴拉特(Bharat)和米兰(Milan)NSArray所指是引用类型的数组,它包含一个指针数组。调用mutableCopy将创建该数组的浅表副本,并使该副本可变,原始副本仍将是不可更改的。但是,对阵列的内容mutableCopy不会copy执行深层复制。是可变的阵列,而不是可变的阵列,而不是数组中保存的对象的目录。

假设以下内容:

@interface MyObject
- (int) state;
- (void) setState:(int) state;
@end

...

_nsarr = [NSArray arrayWithObject:[[MyObject alloc] initWithState]];
_nsmarr = [_nsarr mutableCopy];

此时,您有两个不同的数组,_nsarr_nsmarr,一个不是可变的,一个是HOWEVER,_nsarr[0]并且_nsmarr[0]仍然是同一对象,这意味着它们[_nsarr[0] setState:1]都是有效的,并且具有与[_nsmarr[0] setState:1]

[_nsarr[0] setState:1];
NSLog("%d", [_nsmarr[0] state]);   // ==> 1

[_nsarr[0] setState:2];
NSLog("%d", [_nsmarr[0] state]);   // ==> 2

要复制数组中包含的各个对象,您需要创建该数组的“深层”副本,这意味着(递归地)复制数组的内容以及数组本身。没有快速简便的方法来创建数组的深层副本,因为它很大程度上取决于如何(如果?)对引用的对象进行深层副本。Bharat提出了一种方法(由于序列化和反序列化对象并要求它们遵守,因此成本很高NSCoding),一种方法可能类似于:

_nsmarr = [NSArray withCapacity:[_nsarr count]];
for(MyObject* foo in _nsarr) {
    [_nsmarr addObject:[foo copy]];
}

假设foo实现了该NSCopying协议,那么这基本上与Milan建议的initWithArray:copyItems:方法相同:

_nsmarr = [[NSMutableArray alloc] initWithArray:_nsarr copyItems:YES];

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从“ this”指针创建一个副本,并在不影响“ this” C ++的情况下更改副本

来自分类Dev

如何在不影响原始数组元素的情况下更改ArrayList中的元素?

来自分类Dev

如何在不影响原始内容的情况下仅对内容的反射进行样式设置?

来自分类Dev

在不影响原始安装的情况下卸载rbind安装

来自分类Dev

在不影响单元格引用的情况下对多个函数进行小的更改

来自分类Dev

如何在不影响非暂存更改的情况下丢弃git中的暂存更改

来自分类Dev

在不影响图的情况下更改刻度标签

来自分类Dev

在不影响标题的情况下更改UITableView的Alpha

来自分类Dev

在不影响视图的情况下更改变量

来自分类Dev

如何在不影响图像尺寸的情况下对响应图像进行中心缩放?

来自分类Dev

如何在不影响宽度的情况下更改textarea字体大小

来自分类Dev

如何在不影响安全性的情况下允许用户更改connectionString?

来自分类Dev

如何在不影响Checkbox的情况下更改Checkbox标签的宽度?

来自分类Dev

如何在不影响先前视图的情况下更改UINavigationBar标题的名称?

来自分类Dev

如何在不影响播放的情况下更改jPlayer播放列表的顺序?

来自分类Dev

如何在不影响<td>宽度的情况下更改<th>的宽度

来自分类Dev

如何在不影响文本的情况下删除 <a> </a> 标签?

来自分类Dev

检查软件更新,并在不影响数据库的情况下更新软件

来自分类Dev

如何在不影响行顺序的情况下按降序对df的每一列进行排序?

来自分类Dev

如何在不影响GIT的远程存储库的情况下将更改保留在本地分支中?

来自分类Dev

如何在不影响背景颜色的情况下更改背景图像的不透明度?

来自分类Dev

如何在不影响具有相同状态的其他元素的情况下更改一个元素的状态?

来自分类Dev

Odoo如何在不影响One2many的情况下删除模型中的“创建”按钮?

来自分类Dev

如何在不影响AngularJS中原始变量的情况下操作视图值

来自分类Dev

在不影响路由器的情况下对页面进行分组 - Nuxt.js

来自分类Dev

在不影响存储对象的情况下更改值-Realm Swift

来自分类Dev

我可以在不影响其他程序的情况下更改当前的DateTime吗?

来自分类Dev

CSS-在不影响线性渐变的情况下更改背景图片?

来自分类Dev

如何在不对聚合组的keyf函数进行任何更改的情况下指定原始参数

Related 相关文章

  1. 1

    从“ this”指针创建一个副本,并在不影响“ this” C ++的情况下更改副本

  2. 2

    如何在不影响原始数组元素的情况下更改ArrayList中的元素?

  3. 3

    如何在不影响原始内容的情况下仅对内容的反射进行样式设置?

  4. 4

    在不影响原始安装的情况下卸载rbind安装

  5. 5

    在不影响单元格引用的情况下对多个函数进行小的更改

  6. 6

    如何在不影响非暂存更改的情况下丢弃git中的暂存更改

  7. 7

    在不影响图的情况下更改刻度标签

  8. 8

    在不影响标题的情况下更改UITableView的Alpha

  9. 9

    在不影响视图的情况下更改变量

  10. 10

    如何在不影响图像尺寸的情况下对响应图像进行中心缩放?

  11. 11

    如何在不影响宽度的情况下更改textarea字体大小

  12. 12

    如何在不影响安全性的情况下允许用户更改connectionString?

  13. 13

    如何在不影响Checkbox的情况下更改Checkbox标签的宽度?

  14. 14

    如何在不影响先前视图的情况下更改UINavigationBar标题的名称?

  15. 15

    如何在不影响播放的情况下更改jPlayer播放列表的顺序?

  16. 16

    如何在不影响<td>宽度的情况下更改<th>的宽度

  17. 17

    如何在不影响文本的情况下删除 <a> </a> 标签?

  18. 18

    检查软件更新,并在不影响数据库的情况下更新软件

  19. 19

    如何在不影响行顺序的情况下按降序对df的每一列进行排序?

  20. 20

    如何在不影响GIT的远程存储库的情况下将更改保留在本地分支中?

  21. 21

    如何在不影响背景颜色的情况下更改背景图像的不透明度?

  22. 22

    如何在不影响具有相同状态的其他元素的情况下更改一个元素的状态?

  23. 23

    Odoo如何在不影响One2many的情况下删除模型中的“创建”按钮?

  24. 24

    如何在不影响AngularJS中原始变量的情况下操作视图值

  25. 25

    在不影响路由器的情况下对页面进行分组 - Nuxt.js

  26. 26

    在不影响存储对象的情况下更改值-Realm Swift

  27. 27

    我可以在不影响其他程序的情况下更改当前的DateTime吗?

  28. 28

    CSS-在不影响线性渐变的情况下更改背景图片?

  29. 29

    如何在不对聚合组的keyf函数进行任何更改的情况下指定原始参数

热门标签

归档