NSMutableArray等容器类的Copy注意事项
2015-08-10 17:32
435 查看
NSMutableArray 这一类容器类,即使使用copy或者mutableCopy方法,也只是拷贝了当前第一层元素的指针,并没有做更深层次的拷贝
比如下面的代码中
这时的输出是
如果这时候从另外一个地方修改了字典里的值
那么data也会被修改。
可以看到,copy只是保证了修改arr这个变量,不会修改data里面的值,但是如果修改arr变量里,某个容器的内容,data同样会被修改,尽管data的声明是NSArray。
这个问题,我觉的最好的避免方法,是在往array里AddObject的时候,如果当前是NSArray,那么相应添加的对象,应该尽量使用NSDictionary这种不可变的容器。
比如下面的代码中
[code]@interface ViewController () @property (nonatomic, copy) NSArray* data; @property (nonatomic, strong) NSMutableDictionary* dictData; @end
[code]self.dictData = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@26, @"kein", @15, @"mal", nil];// NSMutableArray* arr = [[NSMutableArray alloc] init]; [arr addObject:self.dictData]; self.data = [arr mutableCopy];//拷贝Array NSLog(@"data: %@", self.data);
这时的输出是
[code]data: ( { kein = 26; mal = 15; } )
如果这时候从另外一个地方修改了字典里的值
[code][self.dictData setObject:@64 forKey:@"chiyun"]; NSLog(@"data: %@", self.data);
那么data也会被修改。
[code]( { chiyun = 64; kein = 26; mal = 15; } )
可以看到,copy只是保证了修改arr这个变量,不会修改data里面的值,但是如果修改arr变量里,某个容器的内容,data同样会被修改,尽管data的声明是NSArray。
这个问题,我觉的最好的避免方法,是在往array里AddObject的时候,如果当前是NSArray,那么相应添加的对象,应该尽量使用NSDictionary这种不可变的容器。
相关文章推荐
- TOMCAT内存的设置
- Linux操作系统文件系统基础知识详解
- Linux常用命令(更新中)
- nginx虚拟目录配置(php-fpm+fastcgi)
- 软件系统架构中的分层思想
- windows 平台开发的JSP程序上传到linux要注意的事项
- Shell之date用法
- OpenCV 高斯、中值、均值、双边滤波
- Ansible中shell,command,raw模块的区别
- iftop与dstat-一次网站故障分析经历
- POJ 2112 Optimal Milking(Floyd+多重匹配+二分枚举)
- Linux系统下的用户审计方法
- CentOS下安装配置PPTP ***服务器
- CentOS/SMTP服务器的构建
- nginx配置文件详解
- B/S架构和C/S架构
- 腾讯TDW:大型Hadoop集群应用[转载]
- LNMP的Nginx启动脚本和配置文件
- Linux修改/etc/profile不生效的问题
- topcoder客户端相关问题