概念
浅层复制(copy):
只复制指向对象的指针,而不复制引用对象本身。
//通过对象的指针来访问这个对象—-只赋值地址
深层复制(mutableCopy):
复制引用对象本身—再创建一个对象 意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来 说,A和A_copy指向的是同一个内存资源,复制的 只不过是是一个指针,对象本身资源 还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一 个思想。深复制就好理解了,内存中存在了两份独立对象本身。
//当修改A时,A copy不变。
总结:简单点理解就是,浅拷贝就是你和你的影子,你没了你的影子也没了。
深拷贝就是你和你的克隆人,你没了你的克隆人还在。
Demo
对不可变的NSString:
NSString *str1=@”test”;
NSString *str2=[str1 copy];
NSLog(@”str1===%@ str2===%@”,str1,str2);
NSLog(@”str1===%p str2===%p”,str1,str2);
结果:
2015-09-19 20:52:42.617 deepCopy_shallowCopy[5807:570805] str1===test str2===test
2015-09-19 20:52:42.617 deepCopy_shallowCopy[5807:570805] str1===0x1022110f8 str2===0x1022110f8NSString *str1=@”test”;
NSString *str2=[str1 mutableCopy];
NSLog(@”str1===%@ str2===%@”,str1,str2);
NSLog(@”str1===%p str2===%p”,str1,str2);
结果
2015-09-19 20:53:23.633 deepCopy_shallowCopy[5826:571504] str1===test str2===test
2015-09-19 20:53:23.634 deepCopy_shallowCopy[5826:571504] str1===0x103c0a0f8 str2===0x7fe443f2d6d0对可变的NSMutableString:
NSString *str1=@”test”;
NSMutableString *str3=[str1 mutableCopy];
NSMutableString *str4=[str3 mutableCopy];
[str4 appendString:@”xzx”];
NSLog(@”str3===%@ str4===%@ “,str3,str4);
NSLog(@”str3===%p str4===%p “,str3,str4);
结果:
2015-09-19 21:04:20.447 deepCopy_shallowCopy[5978:577545] str3===test str4===testxzx
2015-09-19 21:04:20.448 deepCopy_shallowCopy[5978:577545] str3===0x7fd478e14cb0 str4===0x7fd478e28710NSString *str1=@”test”;
NSMutableString *str3=[str1 mutableCopy];
NSMutableString *str4=[str3 copy];
[str4 appendString:@”xzx”];
NSLog(@”str3===%@ str4===%@ “,str3,str4);
NSLog(@”str3===%p str4===%p “,str3,str4);
结果:crash
3.小结
如果对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝)。如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的