前言
拷贝分为深拷贝和浅拷贝,理解拷贝,尤其是深拷贝,需要一些归档知识,该知识我们后面再讲。
讲解
我们通过三个操作方式,以及三种操作方式的内存图,来对比着讲解拷贝。
三种操作方式分别为:辅助运算符操作、浅拷贝操作、深拷贝操作
赋值运算符操作
我们在对两个对象指针进行“=”赋值运算符操作时,实际上的效果相当于给等号右边的变量起了一个等号左边的别名(仅仅是实际效果上),这时不论通过这两个名字中的哪个,对数组进行操纵时,结果都会影响另一个。
请自行脑补金角大王拿着葫芦收孙行者、者行孙、行者孙的场景
NSMutableArray *sunXingZhe = [NSMutableArray arrayWithObject:@”xxx”];
NSMutableArray *zheXingSun = sunXingZhe;
NSMutableArray *xingZheSun = sunXingZhe;
图示
浅复制
指对原指针做mutableCopy操作(接上例代码)浅复制同样不会创建“内容副本”
zheXingSun = [sunXingZhe mutableCopy];
图示
深复制
深复制需要用到归档和解档操作,类似于孙悟空拔毫毛变出另一个叫者行孙的猴子,两个名字指向了长的相同的两个生物体。
NSData haoMao = [NSKeyedArchiver archiverDataWithRootObject:sunXingZhe];
xingZheSun = [NSKeyedUnachiver unarchivedObjectWithData:haoMao];
图示
订正
赋值运算符本质就是浅复制,并非之前说的“其别名”,特订正~↖(^ω^)↗