博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对copy、mutableCopy理解
阅读量:5251 次
发布时间:2019-06-14

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

Objective - C 中有很多在日常项目中经常用到的常用代码,在这里着重的讲一下关于
copy
mutableCopy 的区别以及相关用法。
Objective - C 中可变对象和不可对象经常用的如下:
NSString、 NSMutableString | NSArray、NSMutableArray,
分开说:
A:NSString、 NSMutableString
二者的copy方法返回类型为:
[NSString copy]                         浅拷贝,指针复制,返回的对象的地址和方法的接收者一样,引用计数加1。
[NSMutableString copy]              深拷贝, 深复制,重新 Alloc 一个 NSString 的对象,并返回。返回对象的地址和方法接收者的地址不一样,并且方法接受者的内容改变不影响返回对象,同时返回对象的内容不可以改变。
二者的MutableCopy方法返回的类型为:
[NSString mutableCopy]             深复制,重新Alloc一个NSMuatbleString,并返回。返回对象的地址和方法接收者的地址不一样,2者的内容改变不影响另一者,同时返回对象的内容可以改变。
[NSMutableString mutableCopy]  深复制,重新Alloc一个NSMuatbleString,并返回。返回对象的地址和方法接收者的地址不一样,2者的内容改变不影响另一者,同时返回对象的内容可以改变。
附:浅拷贝和深拷贝的区别
浅拷贝,父对象独立,子对象共享。
深拷贝,父对象独立,子对象独立。
B: NSArray、 NSMutableArray
二者的copy方法返回类型为:
[NSArray copy]         指针复制,返回的对象的地址和方法的接受者的地址一样,引用计数加1,同时array里面的对象的地址都是一样的。
[NSMutableArray copy]  “false深复制” 重新Alloc一个 NSArray对象,并返回,返回对象的地址和方法接收者的地址不一样,并且方法接受者本身内容(增、减等操作,非包含对象内容的变化)改变不影响返回对象,同时返回对象的内容不可以改变。同时array里面的对象的地址都是一样的。
NSArray *srcArray = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];NSMutableArray *arrMCopy = [srcArray mutableCopy]; NSArray        *arrCopy = [srcArray copy]; (lldb) p srcArray (NSArray *) $2 = 0x0cf667c0 @"3 objects"(lldb) p arrCopy (NSArray *) $0 = 0x0cf667c0 @"3 objects" (lldb) p arrMCopy (NSMutableArray *) $1 = 0x0d077ab0 @"3 objects"
二者的MutableCopy方法返回的类型为:
[NSArray mutableCopy]          “false深复制” 重新Alloc一个NSMutableArray 并返回,返回对象的地址和方法接收者的地址不一样,并且2者的本身对象的增加,删除等操作不影响另一者。同时array里面的对象的地址都是一样的。
[NSMutableArray mutableCopy]     “false深复制” 重新Alloc一个NSMutableArray 并返回,返回对象的地址和方法接收者的地址不一样,并且2者的本身对象的增加,删除等操作不影响另一者。同时array里面的对象的地址都是一样的。
 
总结:
1:对于不可变对象,copy都是浅复制,即指针复制。mutableCopy 都是Alloc一个新对象返回。
2:对于可变对象,copy和mutableCopy都是Alloc新对象返回。
3:不论是可变还是不可变对象,copy返回的对象都是不可变的,mutableCopy返回的对象都是可变的。
4:容器类对象,不论是可变的还是不可变的,copy,mutableCopy返回的对象里所包含的对象的地址和之前都是一样 的,即容器内对象都是浅拷贝。

转载于:https://www.cnblogs.com/hcbz/p/5184441.html

你可能感兴趣的文章
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>
Html 小插件5 百度搜索代码2
查看>>
P1107 最大整数
查看>>
多进程与多线程的区别
查看>>
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
java 常用命令
查看>>
CodeForces Round #545 Div.2
查看>>
卷积中的参数
查看>>
51nod1076 (边双连通)
查看>>
Item 9: Avoid Conversion Operators in Your APIs(Effective C#)
查看>>
深入浅出JavaScript(2)—ECMAScript
查看>>
STEP2——《数据分析:企业的贤内助》重点摘要笔记(六)——数据描述
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Linux pipe函数
查看>>