美文网首页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