iOS 浅赋值、深复制、全然复制的知识点梳理验证(附加归档解档)
写于前:
在之前转载的一片文章中。文中对浅复制和深复制进行了具体的解读,同一时候还提到了深复制(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中的深复制仅仅实现了单层复制
全然复制地址不同,说明归档解档方法实现的全然复制其每一层都实现内容拷贝
iOS 浅赋值、深复制、全然复制的知识点梳理验证(附加归档解档)的更多相关文章
- iOS 浅复制、深复制、完全复制的知识点梳理验证(附加归档解档)
在之前转载的一片文章中,文中对浅复制和深复制进行了详细的解读,同时还提到了深复制(one-level-deep copy).完全复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值 ...
- iOS开发中的4种数据持久化方式【一、属性列表与归档解档】
iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...
- IOS数据存储之归档/解档
前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchi ...
- iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档
1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...
- IOS s数据存储之归档解档
#import <Foundation/Foundation.h> @interface Student : NSObject <NSCoding>; @property(no ...
- iOS 知识点梳理
OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错 ...
- iOS 自定义对象及子类及模型套模型的拷贝、归档存储的通用代码
一.runtime实现通用copy 如果自定义类的子类,模型套模型你真的会copy吗,小心有坑. copy需要自定义类继承NSCopying协议 #import <objc/runtime.h& ...
- iOS 集合的深复制与浅复制
概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...
- iOS 浅复制和深复制的深层理解,含示例
转载:https://www.zybuluo.com/MicroCai/note/50592 版权归 @MicroCai 所有 以下是正文: 浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 ( ...
随机推荐
- python tab 自动补全
学习python,经常要使用python命令行查找一些不熟悉的使用方法等等,但是python命令行下没有自带tab补全的功能,看见别人写了tab,可以解决特此记下,以备后用 1.创建tab.py文件, ...
- 如何应对pm2.5
细颗粒物又称细粒.细颗粒.PM2.5:指环境空气中空气动力学当量直径小于等于 2.5 微米的颗粒物,也称细颗粒物.能较长时间悬浮于空气中,其在空气中含量(浓度)越高,就代表空气污染越严重.可吸入颗粒物 ...
- 20140323组队赛 2012福建省第三届ACM省赛题目
A - Solve equation Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- hdu 3874 Assign the task
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- javaweb学习总结(十八)——JSP属性范围(转)
所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...
- elementui table 分页 和 tabel 前加序列号
记录下来备忘 结构如下 Report.vue <template> <div> <home-header></home-header> <div ...
- button 默认类型是submit
“form表单里的按钮,明明是button而不是input type = submit,点击还是提交,如何让它不提交?” (这个问题被我遇到了,很坑爹的,知道了就不以为然了.) 因为 button 默 ...
- Linux命令文件查看过滤
Linux命令篇 1.查看一个文件的后100行的命令: tail -n 100 Linux下查看文件前几行一般用head -n xx,查看后面几行用tail -n xx.除此之外,还有: tail - ...
- 理解webpack中的devTool的配置项
2.1. eval eval 会将每一个module模块,执行eval,执行后不会生成sourcemap文件,仅仅是在每一个模块后,增加sourceURL来关联模块处理前后对应的关系.在webpac ...
- Javascript 限制文本字节数
文本限制字数的问题,在实际开发中经常用到;主要问题出现在对中文的限制,下面代码就解决关于限制字节数的校验问题 以下是引用片段: /* value: 值: byteLength:数据库字节长度 titl ...