什么是浅拷贝与深拷贝

什么是浅拷贝与深拷贝。
浅拷贝就是不可变对象执行不可变拷贝(copy)
深拷贝就是如果执行拷贝时 只要有可变的无论是可变对象还是可变拷贝(mutableCopy)
在简单点说
只有源对象和副本对象都不可变才是浅拷贝,其它都是深拷贝!


copy 创建的是不可变副本(NSString , NSArray, NSDictionary)
mutableCopy 创建的是可变副本 (NSMutableString, NSMutableArray, NSMutableDictionary)
shallow copy 浅拷贝(指针拷贝):相当于做了一次retain操作 引用计数器加1 没有产生新的对象  源对象和副本对象是同一个对象!
deep copy 深拷贝(内容拷贝):源对象和副本对象是两个不同的对象,源对象的计数器不变,副本对象计数器加1(产生了一个新的对象)



那么一般的面试官就会问:深copy 和浅copy的区别是什么?
可参考的回答如下:




  • 浅拷贝:指针(地址)拷贝,不会产生新对象(不产生新的副本),拷贝的地址没有变化,引用计数+1
  • 深拷贝:内容拷贝,会产生新对象(产生新的副本)



copy的效果:对源对象进行拷贝,建立新的副本,彼此修改互不干扰

copy目的:建立对象的副本。

  如果对象有可变/不可变版本的区别,copy方法,只能拷贝出不可变的版本
  如果对象没有可变/不可变的去边,copy方法就是建立一个副本
副本的特点:彼此的内容一样,具有相同的方法。

用-mutableCopy建立对象的可变副本(如果对象有“可变/不可变”版本的区别,才需要使用此方法)


好了,说了这么多,该上一点代码了。
1. copy与MutableCopy

    copy 返回一个不可变对象的副本,MutalbeCopy返回一个可变对象的副本。
  1. NSArray *array=[NSArray arrayWithObjects:@"one",@"two", nil];
  2. NSMutableArray *array1=[array copy];
  3. [array1 addObject:@"three"];  //error
  4. NSMutableArray *array2=[array mutableCopy];
  5. [array2 addObject:@"three"];  //right
  6. // insert code here...
  7. NSLog(@"Hello, World!");
复制代码


2. 浅copy和深copy
  浅复制尽复制对象本身,对象里的属性、包含的对象不做复制
  深复制复制全部,包括对象的属性和其他对象
  Foundation框架支持复制的类,默认是浅复制

  1. NSMutableArray *array=[[NSMutableArray alloc] init];
  2. for(int i=0;i<3;i++)
  3. {
  4.     NSObject *obj=[[NSObject alloc] init];
  5.     [array addObject:obj];
  6. [obj release];
  7. }
  8. for(NSObject *obj1 in array)
  9. {
  10.     NSLog(@"地址为 %p,引用计数是 %ld",obj1,obj1.retainCount);
  11. }
  12. NSMutableArray *array2=[array copy];
  13. for(NSObject *obj2 in array2)
  14. {
  15.     NSLog(@"地址为 %p,引用计数是 %ld",obj2,obj2.retainCount);
  16. }
复制代码
输出如下:

  1. 2013-09-30 17:28:01.492 FDAS[681:303] 地址为 0x1001081f0,引用计数是 1
  2. 2013-09-30 17:28:01.506 FDAS[681:303] 地址为 0x100108230,引用计数是 1
  3. 2013-09-30 17:28:01.506 FDAS[681:303] 地址为 0x100108240,引用计数是 1
  4. 2013-09-30 17:28:01.507 FDAS[681:303] 地址为 0x1001081f0,引用计数是 2
  5. 2013-09-30 17:28:01.507 FDAS[681:303] 地址为 0x100108230,引用计数是 2
  6. 2013-09-30 17:28:01.507 FDAS[681:303] 地址为 0x100108240,引用计数是 2
复制代码

你可能感兴趣的:(什么是浅拷贝与深拷贝)