copy和mutableCopy的深、浅拷贝
来源:互联网 发布:文网文 域名 编辑:程序博客网 时间:2024/04/30 04:40
对象拷贝主要由两种方式:copy和mutableCopy。浅拷贝是指直接将指针指向原有的地址,从而达到复制的目的。深拷贝是指重新生成一个对象,将原有对象的内容复制到新的对象中。copy 返回的是一个不可变的对象,mutableCpoy返回的是一个可变的对象,但是由于OC的弱语法特性,即使如下使用编译器也不会报错。但是再运行时,arrayCopy会找不到具体的方法,报错。
NSMutableArray *arrayCopy=[muArraycopy];
copy当所引用的对象是可变的时,则是深拷贝,如果是不可变对象则是浅拷贝。mutableCopy 不管对象是否为可变,都是深拷贝。
int main(int argc, const char * argv[]){ NSMutableArray *muArray=[[NSMutableArray alloc] init]; //定义一个ClassA类,仅作测试用无实际意义 ClassA *a=[[ClassA alloc] init]; [muArray addObject:a]; NSMutableArray *arrayCopy=[muArray copy];//如果调用add object:则会在运行时报错,但是编译时并不会报错(弱语法) NSMutableArray *arrayMutableCopy=[muArray mutableCopy]; NSLog(@"%p---%p----%p",arrayCopy,muArray,arrayMutableCopy); [a release]; [muArray release]; [arrayMutableCopy release]; [arrayCopy release]; return 0;}打印出来的结果是
2015-01-23 12:06:58.342 Test[3375:303] 0x100100d40---0x1001023b0----0x100105020
可以看出地址都不相同。int main(int argc, const char * argv[]){ NSArray *array=@[@1,@2,@3]; NSArray *arrayCopy=[array copy]; NSMutableArray *arrayMutableCopy=[array mutableCopy]; NSLog(@"%p---%p----%p----%ld",arrayCopy,array,arrayMutableCopy,[arrayCopy retainCount]); [arrayMutableCopy release]; [arrayCopy release]; return 0;}打印出来的结果是
2015-01-23 12:08:40.091 Test[3388:303] 0x100204ae0---0x100204ae0----0x1002054e0----2
可以看出使用copy出来的对象地址与原地址一样,也就是其实是同一个对象。且引用计数器也是2。与所有容器类一样,NSArray中存放的依旧是指针。并不是对象本身,其实数组中每个元素都是对象的地址。当我们使用浅拷贝时我们大部分人都能注意到对象共有的问题。如:
int main(int argc, const char * argv[]){ NSMutableArray *muArray=[[NSMutableArray alloc] init]; //定义一个ClassA类,仅作测试用无实际意义 ClassA *a=[[ClassA alloc] init]; a.val=1;//原数组中,第一个对象的val是1 [muArray addObject:a]; NSArray *arrayCopy=[muArray copy]; ClassA *b=arrayCopy[0]; b.val=2;//将浅拷贝的数组,第一个元素的val变为2 NSLog(@"%ld",[muArray[0] val]); [a release]; [muArray release]; [arrayCopy release]; return 0;}打印结果为
2015-01-23 12:21:32.972 Test[3443:303] 2
即使是深拷贝,依然对原来的数组造成了影响。 0 0
- copy和mutableCopy的深、浅拷贝
- 浅拷贝和深拷贝 iOS 的copy 以及 mutablecopy
- 深拷贝和浅拷贝和copy和mutableCopy总结
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- 深拷贝和浅拷贝(mutableCopy和Copy)详解
- copy和mutableCopy到底是浅拷贝还是深拷贝?
- iOS 浅拷贝和深拷贝的区别? copy和mutableCopy的区别?
- retain、copy、mutableCopy的区别(深拷贝 浅拷贝)
- OC中关于copy和mutableCopy的使用 及深拷贝、浅拷贝的概念
- 关于copy, mutableCopy, 浅拷贝,深拷贝
- Copy(浅拷贝)、MutableCopy(深拷贝)
- Copy mutableCopy 深拷贝、浅拷贝
- copy(浅拷贝) mutableCopy(深拷贝)
- 大家好 我是新手 多多指教
- Android-EditText(自定义带删除功能的EditText)
- EDIUS 视音频制作标准教程(第2版)21堂课高清1280X720 25Pmp4格式 含同步素材 edius初学者必备装备
- Aix6.1搭建tomcat7.0.57步骤
- 山东分公司电风扇地方撒旦法撒旦发生大幅gas的gas大力开发和萨德克里夫个
- copy和mutableCopy的深、浅拷贝
- 搜索指定目录下的所有文件或者指定文件(可用于多级目录)
- 山东分公司大夫撒旦法
- 二级指针的申请与释放
- 计算表达式的值
- 九度1012(并查集)
- Objective - C基础: 第四天 - 3.自定义构造方法
- Linux下远程桌面连接vnc配置
- 1028. 人口普查