博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中拷贝那些事儿
阅读量:5848 次
发布时间:2019-06-19

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

  hot3.png

之前写了一篇,emmmmm,其中的观点 我现在觉得有点出入,具体就是 ,先放结论:

iOS中copy≠浅拷贝 mutablecopy≠深拷贝!这一点是一定的!

首先,我之前的结论是mutablecopy生成对象是可变的就是深拷贝,不可变就是浅拷贝,这个只考虑了内存地址的问题,表象看,好像确实是这样,但我忽略了一点!就是容器类型的,比如数组、字典!这个表象看起来是深拷贝,但是其内部的元素并没有进行拷贝,内部元素还是原来的内存地址,即浅拷贝,代码验证:

NSMutableString *muStr = [[NSMutableString alloc]initWithFormat:@"1"];    self.arr = @[muStr,@"2"];    NSMutableArray *muArr = [[NSMutableArray alloc]initWithArray: self.arr];    NSMutableArray *muArr1 = [muArr mutableCopy];         [muStr appendString:@"-"];    NSLog(@"%p %p %p",self.arr,muArr,muArr1);    NSLog(@"%p %p %p",self.arr[0],muArr[0],muArr1[0]);

打印:

2018-05-29 17:35:10.424029+0800 copy[13811:5524341] 0x600000429b40 0x600000256aa0 0x6000002566e02018-05-29 17:35:10.424227+0800 copy[13811:5524341] 0x600000256680 0x600000256680 0x600000256680

可以看到,三个数字的第一个元素,确实都是同一个地址!但是其数组的内存地址确实不同了!

这说明了什么???mutableCopy并没有进行元素拷贝啊!我去!

再试下字典:

NSMutableString *muStr = [[NSMutableString alloc]initWithFormat:@"f"];    NSDictionary *dic = @{@"1":muStr};    NSMutableDictionary *mudic = [dic mutableCopy];    [muStr appendString:@"-"];    NSLog(@"%@ %@",dic,mudic);

打印结果:

2018-05-29 17:38:14.863844+0800 copy[13886:5527698] {    1 = "f-";} {    1 = "f-";}

由此 我们看到了!所谓的深拷贝并不是很可靠!并没有进行内部元素的拷贝!那么,怎么真正的进行深拷贝而不是单纯的mutableCopy呢?

首先数组:

我们看到有这个方法:

initWithArray:<#(nonnull NSArray *)#> copyItems:<#(BOOL)#>

我们来试验一下:

NSMutableString *muStr = [[NSMutableString alloc]initWithFormat:@"f"];    self.arr = @[muStr,@"2"];    NSMutableArray *muArr = [[NSMutableArray alloc]initWithArray: self.arr];    NSMutableArray *muArr1 = [[NSMutableArray alloc]initWithArray:muArr copyItems:YES];        [muStr appendString:@"-"];    NSLog(@"%p %p %p",self.arr,muArr,muArr1);    NSLog(@"%p %p %p",self.arr[0],muArr[0],muArr1[0]);

打印:

2018-05-29 17:43:09.195246+0800 copy[13999:5532641] 0x604000028c40 0x604000449180 0x604000448dc02018-05-29 17:43:09.195507+0800 copy[13999:5532641] 0x604000448d60 0x604000448d60 0xa000000000000661

变化了!

同理字典也有这个方法:

- (instancetype)initWithDictionary:(NSDictionary
*)otherDictionary copyItems:(BOOL)flag;
NSMutableString *muStr = [[NSMutableString alloc]initWithFormat:@"f"];    NSDictionary *dic = @{@"1":muStr};    NSMutableDictionary *mudic = [[NSMutableDictionary alloc] initWithDictionary:dic copyItems:YES];    [muStr appendString:@"-"];    NSLog(@"%@ %@",dic,mudic);

打印结果:

2018-05-29 17:45:40.835326+0800 copy[14057:5535388] {    1 = "f-";} {    1 = f;}

正好符合我们的预测!

以上!

转载于:https://my.oschina.net/rainwz/blog/1820668

你可能感兴趣的文章
ios的google解析XML框架GDataXML的配置及使用
查看>>
netty-当一个客户端连接到来的时候发生了什么
查看>>
在51CTO三年年+了,你也来晒晒
查看>>
js控制图片等比例缩放
查看>>
Openstack API常用命令
查看>>
跟随我在oracle学习php(8)
查看>>
UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
查看>>
Kotlin的语法糖(一)基础篇
查看>>
亚信安全参加第六届全国等保技术大会 态势感知助力“等保2.0”落地
查看>>
大数据公司Palantir融得7亿美元 曾追踪拉登
查看>>
建立备份策略的重要性
查看>>
发力IoT领域 Marvell注重生态系统发展
查看>>
你应该知道的 RPC 原理
查看>>
Ubuntu安装词典
查看>>
Spring解析
查看>>
python中str和repr区别
查看>>
RedHat6 管理应用服务【11】
查看>>
stm32F10x复习-1
查看>>
[转] vue异步处理错误
查看>>
CSS 3D动画概述菜鸟级解读之一
查看>>