美文网首页iOS面试iOS DeveloperiOS 开发
OC中copy和mutableCopy的详细用法

OC中copy和mutableCopy的详细用法

作者: 小码农_gjw | 来源:发表于2016-08-11 11:57 被阅读828次

前言

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

  • 单层深复制,也就是我们经常说的深复制,我这里说的单层深复制是对于集合类所说的(即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和mutableCopy的详细用法

本文链接:https://www.haomeiwen.com/subject/hytssttx.html