博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 浅赋值、深复制、全然复制的知识点梳理验证(附加归档解档)
阅读量:5082 次
发布时间:2019-06-13

本文共 1680 字,大约阅读时间需要 5 分钟。


写于前:

在之前转载的一片文章中。文中对浅复制和深复制进行了具体的解读,同一时候还提到了深复制(one-level-deep copy)、全然复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值,本文将对这几个概念进行验证梳理。

(单层和全然概念区分:比如多层数组仅仅实现一层内容拷贝,其它层为指针拷贝成为单层深复制;若多层内容都实现拷贝称为全然赋值)


程序中用到的几点概念补充

(1)

浅复制(shallow copy):在浅复制操作时,对于被复制对象的每一层都是指针复制。

深复制(one-level-deep copy):在深复制操作时,对于被复制对象,至少有一层是深复制。
全然复制(real-deep copy):在全然复制操作时,对于被复制对象的每一层都是对象复制。


(2)

归档和解档的概念补充:

有时存在这种需求。即将程序中使用的多个对象及其属性值,以及它们的相互关系保存到文件里,或者发送给另外的进程。为了实现此功能,foundation框架中,能够把相互关联的多个对象归档为二进制文件,并且还能将对象的关系从二进制文件里还原出来。

归档:将对象打包成二进制文件。

NSKeyedArchiver:归档器

解档:归档的逆变换。NSKeyedUnarchiver:解档器
因此能够利用归档和解档来实现全然复制


代码验证

//创建多层数组    NSArray *array = @[@1,@2];    NSArray *oldArray = @[@"xxxx",array];    //浅复制    NSArray *shallowArray = [oldArray copy];    //深复制    NSArray *oneDeepLevelArray = [oldArray mutableCopy];    //全然深复制,利用归档和解档的方式    NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
NSLog(@"%p,%p,%p,%p",oldArray,shallowArray,oneDeepLevelArray,trueDeepCopyArray);

输出结果:

0x7fc7e9c1c0d0,0x7fc7e9c1c0d0,0x7fc7e9c0c5c0,0x7fc7e9c22ef0

从上述打印地址能够看出:

浅复制仅仅是简单的指针赋值,指向内存仍同样。

深复制,和全然深复制都实现了内容的复制,可是是否实现对被复制对象的每一层都复制,通过查看多层数组第二层元素的地址来验证:

NSLog(@"shallow——%p,%p",oldArray[1][0],shallowArray[1][0]);    NSLog(@"oneDeep——%p,%p",oldArray[1][0],oneDeepLevelArray[1][0]);    NSLog(@"trueDeep——%p,%p",oldArray[1][0],trueDeepCopyArray[1][0]);

输出结果:

shallow——0xb000000000000012,0xb000000000000012    oneDeep——0xb000000000000012,0xb000000000000012    trueDeep——0xb000000000000012,0xb000000000000013

结论

浅复制地址同样,这点毫无疑问

深复制地址也同样,就说明第二层元素并没有实现内容拷贝。证实iOS中的深复制仅仅实现了单层复制

全然复制地址不同,说明归档解档方法实现的全然复制其每一层都实现内容拷贝

转载于:https://www.cnblogs.com/liguangsunls/p/7256312.html

你可能感兴趣的文章
Jquery消息提示插件toastr使用详解
查看>>
用Python从网页得到有用信息
查看>>
信用卡还款项目
查看>>
resultType和resultMap的区别
查看>>
关于在iOS设备上探测WIFI,3G,GPRS使用情况的细节
查看>>
关于排序的实现
查看>>
处理【由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面】...
查看>>
关于Java内部类(类中类)反射实例化的备忘贴
查看>>
C#字符串来袭——因为爱,所以爱
查看>>
Hibernate入门---总结:增删改----完整【第一天】
查看>>
我为什么写博客
查看>>
2019年牛客多校第一场 I题Points Division 线段树+DP
查看>>
Jeston TX2 备份
查看>>
为Winform配置双缓冲避免闪屏
查看>>
Ztree之初涉——简单Ztree的实现
查看>>
数据库设计
查看>>
解决Nginx的connect() to 127.0.0.1:8080 failed (13: Permission denied) while connect
查看>>
linux下安装无线网卡驱动
查看>>
功能网站
查看>>
jq中获取object 的键值key
查看>>