ios-深拷贝和浅拷贝
来源:互联网 发布:上海交通大学学报知乎 编辑:程序博客网 时间:2024/06/05 10:29
一、深拷贝和浅拷贝
- 深拷贝:对象拷贝 - 直接拷贝内容。
- 浅拷贝:指针拷贝 - 将指针中的地址值拷贝一份。
(浅拷贝只是拷贝指向对象的指针,不拷贝引用对象本身,两者共用一个对象,当内存销毁的时候,指向对象的几个指针需要重新定义才可以使用,要不然会成为野指针;深拷贝拷贝引用对象本身。)
二、对于 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 =
0x104d94068
copyStr=0x104d94068
指针地址:str =0x7fff529e9aa8
copyStr=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 =
0x7fa522712cd0
copyStr1 =0x7fa522717ba0
指针地址:str1 =0x7fff529e9a98
copyStr1=0x7fff529e9a90
小结:对可变字符串的copy,我们默认进行了一次深拷贝,直接拷贝了对象。- 方案三:
mutableCopy不可变的字符串
输出结果:str2 =NSString*str2 = @"ccc";NSMutableString *copyStr2 = [str2 mutableCopy];NSLog(@"str2 = %p copyStr2 = %p",str2,copyStr2);
0x10d216108
copyStr2 =0x7fa522726290
小结:对于不可变字符串的mutableCopy我们默认进行了深拷贝。 - 方案四:
mutableCopy可变的字符串
输出结果:str3 =NSMutableString*str3 = [NSMutableString stringWithFormat:@"ddd"];NSMutableString*copyStr3 = [str3 mutableCopy];NSLog(@"str3 = %p copyStr3 = %p",str3,copyStr3);
0x7fa5227153c0
copyStr3 =0x7fa5227263f0
小结:对于可变字符串的mutableCopy我们默认进行了深拷贝。
三、结论
- copy:
因为copy默认返回的是不可变的,所以当我们对一个不可变的字符串进行copy的时候,我们只是拷贝了它的指针(浅拷贝)。当我们对一个可变的字符串进行拷贝的时候,因为类型转变了,我们需对其进行深拷贝
。 - mutableCopy:默认返回的是一个可变的对象,适用于可变的对象,例如NSMutableString,NSMutableArray,NSMutableDictionary、etc。
无论对于可变的字符串还是不可变的字符串进行mutableCopy,系统都默认进行深拷贝
,那么为什么对于相同类型的进行mutableCopy返回的仍然是新的对象呢,因为在这里系统要保证,旧的对象和新的对象都是可变的,且他们之间不会相互影响。
原文链接:http://www.jianshu.com/p/63239d4d65e0
相关内容:https://segmentfault.com/a/1190000000604331
0 0
- iOS:关于浅拷贝和深拷贝
- 【IOS】浅拷贝和深拷贝
- iOS深拷贝和浅拷贝
- iOS 深拷贝和浅拷贝
- ios 深拷贝和浅拷贝
- ios-深拷贝和浅拷贝
- iOS 深拷贝和浅拷贝
- iOS深拷贝和浅拷贝解析
- iOS伪拷贝, 浅拷贝, 深拷贝
- [ios]深拷贝,浅拷贝
- iOS深拷贝浅拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 浅拷贝和深拷贝
- NOIP2015 神奇的幻方 解题报告(水题模拟)
- 计算机视觉开源项目
- hibernate--单一主键
- shell -- 数学计算总结
- SpringMVC实现文件下载
- ios-深拷贝和浅拷贝
- Android面试题
- Spring AOP:面向切面编程简介
- Codeforces Round #272 (Div. 2) A Dreamoon and Stairs(水)
- mysql字符集(character set)
- selenium 实现爬虫
- Android性能优化——数据结构的优化
- Mybatis整合Spring
- 安卓快速启动页可加特效