OC中copy和mutableCopy的详细用法

前言

首先我们要先明白一个概念,什么是浅复制,单层深复制,完全复制(每一层都深复制)
  • 浅复制也就是所说的指针复制,并没有进行对象复制

  • 单层深复制,也就是我们经常说的深复制,我这里说的单层深复制是对于集合类所说的(即NSArray,NSDictionary,NSSet),单层深复制指的是只复制了该集合类的最外层,里边的元素没有复制,(即这两个集合类的地址不一样,但是两个集合里所存储的元素的地址是一样的)

  • 完全复制,指的是完全复制整个集合类,也就是说两个集合地址不一样,里边所存储的元素地址也不一样

明白了这三个概念之后,我们就来说一下他们的区别所在:
  • 非集合类(NSString,NSNumber)
 [immutableObject copy]  //浅复制  
 [immutableObject mutableCopy] //深复制
 [mutableObject copy] //深复制
 [mutableObject mutableCopy] //深复制

结论:不可变进行copy是浅复制,mutableCopy是深复制,可变的copy,mutableCopy都是深复制

  • 集合类(NSArray,NSDictionary, NSSet)
 [immutableObject copy]  //浅复制
 [immutableObject mutableCopy] //单层深复制
 [mutableObject copy] //单层深复制
 [mutableObject mutableCopy] //单层深复制

结论:不可变进行copy是浅复制,mutableCopy是单层深复制,可变的copy,mutableCopy都是单层深复制

那么如何实现多层复制呢?

我们以NSArray举例说明

 NSArray *copyArray = [[NSArray alloc] initWithArray:array copyItems:YES];  // 完全复制
需要特别注意的是

以上我们所说的两种情况默认都实现了NSCopying和NSMutableCopying协议
对于自定义继承自NSObject的类

  • copy需要实现NSCopying协议,然后实现以下方法,否则copy会crash
-(id)copyWithZone:(NSZone *)zone {
     CopyObject  *copy = [[[self class] alloc] init];
     copy.name = self.name;
     copy.mobile = self.mobile;
     copy.company = self.company;
     copy.descInfo = self.descInfo;
     return copy;
 }
  • mutableCopy时,需要实现NSMutableCopying协议,否则mutableCopy会crash
 -(id)mutableCopyWithZone:(NSZone *)zone {
     MutableCopyObject  *mutableCopy = [[[self class] alloc] init];
     mutableCopy.name = self.name;
     mutableCopy.mobile = self.mobile;
     mutableCopy.company = self.company;
     mutableCopy.descInfo = self.descInfo;
     return mutableCopy;
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 不敢说覆盖OC中所有copy的知识点,但最起码是目前最全的最新的一篇关于 copy的技术文档了。后续发现有新...
    zyydeveloper阅读 3,465评论 4 35
  • 本文为转载: 作者:zyydeveloper 链接://www.greatytc.com/p/5f776a...
    Buddha_like阅读 938评论 0 2
  • 今天学习了一下iOS中关于深拷贝和浅拷贝的一些概念,感觉是真的绕,把我虎的一愣一愣的,更加加深了我对自己没有好好学...
    苍茫的天涯阅读 6,025评论 6 19
  • 1、对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直接...
    滴答大阅读 793评论 0 2
  • 能穿的上那条裤子的一瞬间,顿时觉得自己居然还算瘦的。
    sakurakang1993阅读 151评论 0 0