iOS浅拷贝和深拷贝的浅解

分享是每个优秀的程序员所必备的品质


什么是深拷贝与浅拷贝

  • copy 创建的是不可变副本(NSString、NSArray、NSDictionary)
  • mutableCopy 创建的是可变的副本(NSMutableString, NSMutableArray, NSMutableDictionary)

浅 复 制:在复制操作时,对于被复制的对象的每一层复制都是指针复制。
深 复 制:在复制操作时,对于被复制的对象至少有一层复制是对象复制。
完全复制:在复制操作时,对于被复制的对象的每一层复制都是对象复制


深copy 和浅copy的区别是什么?

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

浅拷贝只是复制对象本身,对象的属性和包含的对象不做复制。
深拷贝则对对象本身复制,同是对对象的属性也进行复制。
深浅拷贝的本质区别是对象或者对象属性的内存地址是否一样,一样则为浅拷贝,不一样则为深拷贝。
Foundation框架支持复制的类,默认是浅拷贝。

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

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

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

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

1.copy与MutableCopy

copy 返回一个不可变对象的副本,MutalbeCopy返回一个可变对象的副本。

NSArray *array=[NSArray arrayWithObjects:@"one",@"two", nil];
NSMutableArray *array1=[array copy];
[array1 addObject:@"three"];  //error
NSMutableArray *array2=[array mutableCopy];
[array2 addObject:@"three"];  //right
// insert code here...
NSLog(@"Hello, World!");

浅copy和深copy

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

NSMutableArray *array=[[NSMutableArray alloc] init];
for(int i=0;i<3;i++){
    NSObject *obj=[[NSObject alloc] init];
    [array addObject:obj];
   [obj release];
}
for(NSObject *obj1 in array){
    NSLog(@"地址为 %p,引用计数是 %ld",obj1,obj1.retainCount);
}
NSMutableArray *array2=[array copy];
for(NSObject *obj2 in array2){
    NSLog(@"地址为 %p,引用计数是 %ld",obj2,obj2.retainCount);
}
输出:
2013-09-30 17:28:01.492 FDAS[681:303] 地址为 0x1001081f0,引用计数是 1
2013-09-30 17:28:01.506 FDAS[681:303] 地址为 0x100108230,引用计数是 1
2013-09-30 17:28:01.506 FDAS[681:303] 地址为 0x100108240,引用计数是 1
2013-09-30 17:28:01.507 FDAS[681:303] 地址为 0x1001081f0,引用计数是 2
2013-09-30 17:28:01.507 FDAS[681:303] 地址为 0x100108230,引用计数是 2
2013-09-30 17:28:01.507 FDAS[681:303] 地址为 0x100108240,引用计数是 2

结论:

1、对不可变的对象做 copy:得到的是不可变对象的地址,浅拷贝,拷贝指针,所以,没有产生新对象,依旧不可变;———>浅拷贝
2、对不可变的对象做 mutableCopy :产生新的对象,该对象是可变的。———>深拷贝
3、对可变对象做 copy:得到的是新地址,也就是说,产生了新对象,但是,新对象是不可变的;———>深拷贝
4、对可变对象做 mutableCopy:产生新的对象,该对象是可变的。———>深拷贝

个人浅见,有错误的地方,欢迎指正和补充

你可能感兴趣的:(iOS浅拷贝和深拷贝的浅解)