Copy-->Mutable Copy
2015-12-20 14:52
344 查看
一、深拷贝和浅拷贝
深拷贝:对象拷贝 - 直接拷贝内容。浅拷贝:指针拷贝 - 将指针中的地址值拷贝一份。
二、对于 Copy 与 mutableCopy 的实践
思路:我用四个方案来验证 Copy 与 mutableCopy 的区别。
方案:
方案一:
copy不可变的字符串
NSString*str = @"aaa"; NSString*copyStr = [str copy]; NSLog(@"str = %p copyStr= %p",str,copyStr); NSLog(@"指针地址:str = %p copyStr= %p",&str,©Str);
输出结果:str =
0x104d94068copyStr=
0x104d94068
指针地址:str =
0x7fff529e9aa8copyStr=
0x7fff529e9aa0
小结:对
不可变的字符串的copy,我们对象的内存地址没有改变,只是指针的地址改变了,所以在这里我们默认进行了一次
浅拷贝,只拷贝了指针。
方案二:
copy可变的字符串
NSMutableString*str1 = [NSMutableString stringWithFormat:@"bbb"]; NSString*copyStr1 = [str1 copy]; NSLog(@"str1 = %p copyStr1 = %p",str1,copyStr1); NSLog(@"str1 = %p copyStr1= %p",&str1,©Str1);
输出结果:str1 =
0x7fa522712cd0copyStr1 =
0x7fa522717ba0
指针地址:str1 =
0x7fff529e9a98copyStr1=
0x7fff529e9a90
小结:对可变字符串的copy,我们默认进行了一次深拷贝,直接拷贝了对象。
方案三:
mutableCopy不可变字符串的
NSString*str2 = @"ccc"; NSMutableString *copyStr2 = [str2 mutableCopy]; NSLog(@"str2 = %p copyStr2 = %p",str2,copyStr2);
输出结果:str2 =
0x10d216108copyStr2 =
0x7fa522726290
小结:对于不可变字符串的mutableCopy我们默认进行了深拷贝。
方案四:
mutableCopy可变字符串
NSMutableString*str3 = [NSMutableString stringWithFormat:@"ddd"]; NSMutableString*copyStr3 = [str3 mutableCopy]; NSLog(@"str3 = %p copyStr3 = %p",str3,copyStr3);
输出结果:str3 =
0x7fa5227153c0copyStr3 =
0x7fa5227263f0
小结:对于可变字符串的mutableCopy我们默认进行了深拷贝。
三、结论
copy:因为copy默认返回的是不可变的,所以当我们对一个不可变的字符串进行copy的时候,我们只是拷贝了它的指针(浅拷贝)。当我们对一个可变的字符串进行拷贝的时候,因为类型转变了,我们需对其进行深拷贝。
mutableCopy:默认返回的是一个可变的对象,适用于可变的对象,例如NSMutableString,NSMutableArray,NSMutableDictionary、etc。
无论对于可变的字符串还是不可变的字符串进行mutableCopy,系统都默认进行深拷贝,那么为什么对于相同类型的进行mutableCopy返回的仍然是新的对象呢,因为在这里系统要保证,旧的对象和新的对象都是可变的,切他们之前不会相互影响。
相关文章推荐
- CentOS 6.4下编译安装MySQL 5.6.16
- linux下jdk安装与配置
- hadoop伪分布的搭建与测试编码
- hadoop集群搭建与测试编码
- 虚拟机中linux系统启动的tomcat无法在本机访问的问题
- mac apache php相关
- Linux学期总结
- tp-wr720n刷openwrt+mentohust锐捷上网
- 理解RESTful架构
- Linux下配置iptables实现外网访问内网KMS服务器
- 阿岳之_Centos7.1用户基本权限轻松管理篇
- Android控件架构简述
- 【Nginx】不中断现有连接,平滑升级Nginx
- 记录本博客从windows server 2008 迁移到centos碰到的问题
- 阿里云云盾占用过多内存
- Linux 文件相关的常用命令
- 对NSRunLoop的了解
- Linux之Raid详解
- 自动化运维工具SaltStack - 分组(使用记录,groups)
- linux下的工具