A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 佩玉鸣 中级黑马   /  2015-3-24 10:12  /  1282 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 佩玉鸣 于 2015-3-24 10:15 编辑

1.浅复制
浅复制只复制对象本身,对象里的属性、包含的对象不做复制 深复制复制全部,包括对象的属性和其他对象Foundation框架支持复制的类,默认是浅复制 。
  1. NSMutableArray *array=[[NSMutableArray alloc] init];
复制代码
从打印结果可以看出
a、对于数组,浅复制的话只复制了数组的地址,而数组里面的元素仍未复制,如果想要复制里面的元素,则需要实现深复制;
b、对于字符串,浅复制的话只是增加了对字符串地址的引用,计数器+1,深复制对字符串进行了重新开辟了空间,地址变化 。



  1. NSArray *array=[NSArray arrayWithObjects:@"one",@"two", nil];
  2. NSMutableArray *array1=[array copy];                             
  3. //array1的地址跟array地址一样,相当于浅复制
  4. [array1 addObject:@"three"];                                
  5. //这里执行错误
  6. NSMutableArray *array2=[array mutableCopy];                 
  7. // array2的地址跟array地址不一样
  8. [array2 addObject:@"three"];                                
  9. //执行正确
  10.     NSMutableArray * array3 =[[NSMutableArray alloc] init];
  11.     NSLog(@"地址为 %p",array3);
  12.     NSMutableArray * array4 = [array3 copy];
  13. NSLog(@"地址为 %p",array4);
复制代码

a、copy返回一个不可变对象的副本,MutalbeCopy返回一个可变对象的副本
b、array1地址与array地址一样,是因为Foundation对于copy不可变(NSArray,NSString之类)对象而言,默认都是浅拷贝,相当于retain,当然此时用mutableCopy相当于copy功能
同样,对于可变对象进行copy操作时,相当于copy而非retain,此时copy的对象不可变,如果需要可变则mutableCopy
c、array2地址与array地址不一样,相当于实现了数组的复制功能,当然如果需要对里面的元素进行复制,需要实现深度复制 。





2.深复制
对象拥有深复制特性,必须实现NSCopying,NSMutableCopying协议,实现该协议的copyWithZone方法和mutableCopyWithZone方法深拷贝和浅拷贝的区别就在于copyWithZone方法的实现 。

  1. @interface Person : NSObject<NSMutableCopying>
  2. @property(nonatomic,copy)NSString *name;
  3. @property(nonatomic,copy)NSString *age;
  4. @end

  5. @implementation Person
  6. - (id)mutableCopyWithZone:(NSZone *)zone
  7. {
  8.     Person *person=[[self class] allocWithZone:zone];
  9.     person.age=[_age mutableCopy];
  10.     person.name=[_age mutableCopy];
  11.     return person;
  12. }
  13. @end
  14.     Person *person=[[Person alloc] init];
  15.     person.name=@"andy";
  16.     person.age=@"20";
  17.     Person *person2=[person copy];
  18.     NSLog(@"地址为 %p",person);
  19.     NSLog(@"地址为 %p",person2);
  20.     NSLog(@"地址为 %p",person.name);
  21.     NSLog(@"地址为 %p",person2.name);
复制代码

  1. NSMutableArray * array2 =  [[NSMutableArray alloc] initWithArray:array1 copyItems:YES];
复制代码

打印出来结果是不仅仅复制了person地址,person中的对象地址也进行了复制 。
实现数组的深度复制,复制的不仅仅是数组本身,数组中的元素也被复制。


2 个回复

倒序浏览
说的还是比较详细
回复 使用道具 举报
你百度的这些东西不要全部相信,有些很多都是错的,自己总结的才是正确的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马