博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
copy与mutableCopy
阅读量:7096 次
发布时间:2019-06-28

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

hot3.png

一、深拷贝和浅拷贝

  • 深拷贝:对象拷贝 - 直接拷贝内容。

  • 浅拷贝:指针拷贝 - 将指针中的地址值拷贝一份。

二、对于 Copy 与 mutableCopy 的实践

  • 思路:我用四个方案来验证 Copy 与 mutableCopy 的区别。

  • 方案:

    • 方案一:copy不可变的字符串

NSString*str = @"aaa";NSString*copyStr = [str copy];NSLog(@"str = %p copyStr= %p",str,copyStr);NSLog(@"指针地址:str = %p copyStr= %p",&str,&copyStr);

    输出结果:str = 0x104d94068 copyStr= 0x104d94068

    指针地址:str = 0x7fff529e9aa8 copyStr= 0x7fff529e9aa0
    小结:对不可变的字符串的copy,我们对象的内存地址没有改变,只是指针的地址改变了,所以在这里我们默认进行了一次浅拷贝,只拷贝了指针。

  • 方案二:copy可变的字符串

NSMutableString*str1 = [NSMutableString stringWithFormat:@"bbb"];NSString*copyStr1 = [str1 copy];NSLog(@"str1 = %p copyStr1 = %p",str1,copyStr1);NSLog(@"str1 = %p copyStr1= %p",&str1,&copyStr1);

    输出结果:str1 = 0x7fa522712cd0 copyStr1 = 0x7fa522717ba0

    指针地址:str1 = 0x7fff529e9a98 copyStr1= 0x7fff529e9a90
    小结对可变字符串的copy,我们默认进行了一次深拷贝,直接拷贝了对象。

    方案三:mutableCopy不可变字符串的

NSString*str2 = @"ccc";NSMutableString *copyStr2 = [str2 mutableCopy];NSLog(@"str2 = %p copyStr2 = %p",str2,copyStr2);

    输出结果:str2 = 0x10d216108 copyStr2 = 0x7fa522726290

    小结对于不可变字符串的mutableCopy我们默认进行了深拷贝。

 

三、结论

  • copy:因为copy默认返回的是不可变的,所以当我们对一个不可变的字符串进行copy的时候,我们只是拷贝了它的指针(浅拷贝)。当我们对一个可变的字符串进行拷贝的时候,因为类型转变了,我们需对其进行深拷贝

  • mutableCopy:默认返回的是一个可变的对象,适用于可变的对象,例如NSMutableString,NSMutableArray,NSMutableDictionary、etc。  无论对于可变的字符串还是不可变的字符串进行mutableCopy,系统都默认进行深拷贝,那么为什么对于相同类型的进行mutableCopy返回的仍然是新的对象呢,因为在这里系统要保证,旧的对象和新的对象都是可变的,切他们之前不会相互影响。

注:经过copy后返回的对象都是不可变的,如果被copy的对象也是不可变的,那么不会重新分配内存,如果被copy的对象是可变的,那么会重新分配内存;经过mutableCopy后返回的对象是可变的,无论被mutableCopy的对象是否可变,那么都会重新分配内存

 

转载于:https://my.oschina.net/jlongtian/blog/597965

你可能感兴趣的文章
新手如何快速入门node.js
查看>>
如何给容器服务的Docker增加数据盘
查看>>
配置WordPress回收站功能
查看>>
我收集的资料网站
查看>>
Java基础-第2天
查看>>
有一种爱叫白头偕老
查看>>
linux返回码 $?
查看>>
jQuery formvalidator插件 API帮助文档
查看>>
debian系统双机heartbat配置
查看>>
为什么存在内存对齐
查看>>
python学习之函数
查看>>
如何使用uiautomatorviewer来扫描和分析UI组件
查看>>
IOS视图互换
查看>>
第二十四课 shell的特殊符号及cut_sort_wc_uniq_tee_tr_split 命令
查看>>
Linux下安装Tomcat
查看>>
Kendo UI常用示例汇总(十八)
查看>>
3 Tomcat
查看>>
DevExpress v17.2—WPF篇(一)
查看>>
报表平台IE11和Chrome设置步骤
查看>>
Android WebView的使用
查看>>