ios 关于浅拷贝(copy)和深拷贝(mutableCopy)你真的了解吗?

面试官:

1.浅拷贝和深拷贝你了解吗?详细说说?
2.修改原对象的值,副本对象会变吗?
3.copy 一个可变的数组,会出现什么结果?
4.用 copy 修饰 NSMutableArray @property (nonatomic, copy) NSMutableArray *myArray;,对myArray 赋值会有什么结果?
5.对属性strong对象进行copy操作,会开辟新内存空间吗?

面试者:浅拷贝是值的拷贝,深拷贝是地址和值的拷贝,巴拉巴拉。。。。。。

copy 和 mutableCopy 你真的理解吗?最近发现很多面试者都不能很好地回答这个问题。所以整理一下相关知识

问题1 浅拷贝和深拷贝理解

1.copy :不拷贝对象本身,只拷贝指向对象的指针

2.mutableCopy: 直接拷贝整个对象内存到另一块内存中

NSArray *array = [NSArray arrayWithObjects:@(2),@(3),@(5),@(8),@(3),@(2),@(5),nil];
NSArray *copyArray = array.copy;
NSArray *mutableArray = array.mutableCopy;
NSLog(@"array===========%p\ncopyArray=============%p\nmutableArray===============%p=",array,copyArray,mutableArray);

输出结果为:
array===========0x60000179bb60
copyArray=============0x60000179bb60
mutableArray===============0x600003ad81b0=
copyArray 与array的指针地址相同,值相同 ,而mutableArray 与array 指针内存地址不同
非常形象的比喻:copy:你和你的影子 mutableCopy 你和你的双胞胎兄弟

问题2 修改原对象的值,副本对象会变吗?先看一段代码

NSString *originStr = @"hongbao";
NSString *copyString = [originStr copy];
NSString *mutableCopyString = [originStr mutableCopy];
NSLog(@"\noriginStr----%p----value:%@",originStr,originStr);
NSLog(@"\ncopyString----%p----value:%@",copyString,copyString);
NSLog(@"\nmutableCopyString----%p----value:%@",mutableCopyString,mutableCopyString);
originStr = @"hongbaocui";
NSLog(@"\noriginStr----%p----value:%@----change",originStr,originStr);
NSLog(@"\ncopyString----%p----value:%@----change",copyString,copyString);
NSLog(@"\nmutableCopyString----%p----value:%@----change",mutableCopyString,mutableCopyString);

输出结果:

  originStr----0x10ead6040----value:hongbao
  copyString----0x10ead6040----value:hongbao
  mutableCopyString----0x600001769dd0----value:hongbao

修改 源对象的值,副本对象不会改变

  originStr----0x10ead60c0----value:hongbaocui----change   //源对象地址已经改变
  copyString----0x10ead6040----value:hongbao----change
  mutableCopyString----0x600001769dd0----value:hongbao----change

由上面例子可以看出:源对象改变:地址变为:0x10ead60c0 副本的对象地址不变,copy地址为0x10ead6040 mutablecopy地址为:0x600001769dd0与之前相同
所以copy还有以下特点:

  修改源对象的属性和行为,不会影响副本对象
  修改副本对象的属性和行为,不会影响源对象

问题3 copy 一个可变的数组,会出现什么结果? 如下:

NSMutableArray *mutableArray1 = [NSMutableArray arrayWithObjects:@"3",@"4", nil];
NSLog(@"mutableArray1:%p---------%@",mutableArray1,mutableArray1);
NSMutableArray *copyArray1 = mutableArray1.copy;
NSLog(@"copyArray1:%p---------%@",copyArray1,copyArray1);

打印结果:

mutableArray1:0x600002b135a0---------(3,4) 
copyArray1:0x60000256c7a0---------(3,4)

内存地址来看,地址改变。mutableArray1 为可变的,copyArray1 为不可变的,是通过copy 拷贝来的,mutableArray1指向可变的空间,copyArray1指向不可变的空间,所以copy 浅拷贝已经不适合原来指向的内存你空间,因此 copy从新开辟内存空间

问题4 用 copy 修饰 NSMutableArray @property (nonatomic, copy) NSMutableArray *myArray;,对myArray 赋值会有什么结果?

由问题3可知道,可以看出内存地址不一样,但是myArray 是不可变的数组。因为 myArray声明的时候是用 copy修饰,那么就限制了他为不可变的数组。

问题4 对属性strong对象进行copy操作,会开辟新内存空间吗?

不会

问题5 一个数组中包含属性,copy或者mutablecopy ,数组中的值会被copy或者mutablecopy吗?上代码:

NSMutableArray *array_cui = [NSMutableArray arrayWithCapacity:1.0];
HBTestTools *t1 = [[HBTestTools alloc] init];
[array_cui addObject:t1];
HBTestTools *t2 = [[HBTestTools alloc] init];
[array_cui addObject:t2];
NSLog(@"array_cui:%p----array_cui:--value--%@",array_cui,array_cui);
NSMutableArray *objarray =  array_cui.copy;
NSLog(@"objarray:%p----array_cui:--value--%@",objarray,objarray);
NSMutableArray *objarray_mutableCopy =  array_cui.mutableCopy;
 NSLog(@"objarray_mutableCopy:%p----objarray_mutableCopy:--value--%@",objarray_mutableCopy,objarray_mutableCopy);

打印结果如下:
array_cui:0x6000010393e0----array_cui:--value--(
"<HBTestTools: 0x600001c5c740>",
"<HBTestTools: 0x600001c5c750>"
)
objarray:0x600001e08080----array_cui:--value--(
"<HBTestTools: 0x600001c5c740>",
"<HBTestTools: 0x600001c5c750>"
)
objarray_mutableCopy:0x600003cdfab0----objarray_mutableCopy:--value--(
"<HBTestTools: 0x600003099f40>",
"<HBTestTools: 0x600003099f30>"
)
由结果可以看出:
copy地址改变(查看问题3),数组中的对象地址并不改变
mutablecopy 地址同样改变,数组中的对象地址并不改变

总结

copy 修饰的或者赋值的为不可变的,只说copy 是地址copy 不准确,当为mutableCopy 对象进行copy操作时,会重新开辟内存空间

copy和mutableCopy 操作,修改源对象的属性和行为,不会影响副本对象;修改副本对象的属性和行为,不会影响源对象。

对象之间mutableCopy赋值,肯定会拷贝整个对象内存到另一块内存中

对象之间赋值之后,再改变,遵循互不影响的原则
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260