拷贝

作者: Cy_Star | 来源:发表于2017-10-18 17:14 被阅读9次

    一、拷贝:

    任何实现拷贝功能都需要实现NSCopying协议。

    1、深拷贝:

    开辟一个新空间,对对象本身进行拷贝以外,还会对对象里包含的子元素逐个进行拷贝,指向的内存新的内存空间。

    2、浅拷贝:

    开辟一个新的空间,但是空间指向的内容(内存空间、指针)还是原来的内容。

    二、copy 和 mutableCopy

    NSString * s = [NSString   stringWithFormat:@"hello"];
    NSString * s2 = [s copy];
    /--这个时候把 s 拷贝了一份 s2 还是一个只读的字符串
    
    NSMutableString * s3 = [s mutableCopy];
    [s3 appendString: @"ss"];  
    /--这个时候把 s 拷贝了一份 s3 是一个可变的字符串 ,这样可以通过 mutableCopy 可以把不可变的字符串变成可变字符串;
    反之也可使用 copy 把可变字符串变成不可变的字符串。
    
    NSMutableString * s4 = [NSMutableString stringWithFormat:@"4444"];
    NSMutableString * s5 = [s4 copy];    //---s5 是一个不可变的字符串,copy把可变的变成不可变的。
    

    如果是对类这个对象进行 copy ,就要在类的 .h文件遵循NSCopying协议。

    //在类 .m文件里面使用NSCopying协议里的方法
      //一旦使用了 [** copy]; ,这个方法就会得到触发
    -(id)copyWithZone: (NSZone *) zone{
              /新分配一个对象
              类 * m = [[self class] allocWithZone: zone]init];
              
              /比如 copy 名字 name
              m.name = self.name;
    
              return m;
    }
    
    //实现上述的类进行 copy 操作  如类是:Dog
     Dog * m1 = [[Dog alloc]init];
     m1.name = "小黄";
     Dog * m2 = [m1 copy]; 
    // [m1 copy]; 就会触发  -(id)copyWithZone: (NSZone *) zone; 这个方法。
    

    相关文章

      网友评论

        本文标题:拷贝

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