About Copy —— 复制

-(void)CopyTest{
    NSMutableString *element_A = [NSMutableString stringWithString:@"AA"];
    NSMutableString *element_B = [NSMutableString stringWithString:@"BB"];
    NSMutableString *element_C = [NSMutableString stringWithString:@"CC"];
    NSMutableString *element_D = [NSMutableString stringWithString:@"DD"];
    
    NSMutableArray *array_AA = [NSMutableArray arrayWithObjects:element_A,element_B,element_C,element_D ,nil];
//===================== 浅复制 =======================
    NSMutableArray *array_BB = [array_AA mutableCopy];
    //改动array_AA之前
    NSLog(@"arrayAA=%@\narrayBB=%@",array_AA,array_BB);
    [array_AA removeObject:element_C];
    //改动之后
    NSLog(@"arrayAA=%@\narrayBB=%@",array_AA,array_BB);
//===================== 需要深复制 =======================
    //改动数组中的元素
    [element_B deleteCharactersInRange:NSMakeRange(0, 1)];
    //改动之后
    NSLog(@"arrayAA=%@\narrayBB=%@",array_AA,array_BB);
}

复制 意味着有两个内存地址!而不是简单的赋值! 赋值≠复制!

深复制和浅复制

打印结果

arrayAA=(AA,BB,CC,DD)
arrayBB=(AA,BB,CC,DD)
2015-12-09 20:31:44.121 test[1077:157053] 浅复制
arrayAA=(AA,BB,DD)
arrayBB=(AA,BB,CC,DD)
2015-12-09 20:31:44.121 test[1077:157053] 需要深复制
arrayAA=(AA,B,DD)
arrayBB=(AA,B,CC,DD)

  • 例子中的 arrayA和B都是数组,把A浅复制给B之后,改变A中的元素(移除某个元素),B不
  • 但是,改变A中的元素的具体值,即具体到单个字符串元素的值改变了(增加或变更字符),B也会跟着改变,这时候就需要深复制
    • 需要通过for(xxx in array) 逐一使用 [xx mutableCopy]实现
    • 通过NSKeyedArchiver 和 NSKeyedUnarchived 压缩归档后取出,来完成深复制. 这样做的好处是,不论如何修改A,已归档的B都不会受影响
      • 如下:
    //1. 从源对象获取内容,压缩至指定路径,压缩成2进制.数据类型可以是txt也可以是plist甚至可以不用后缀名
    [NSKeyedArchiver archiveRootObject:array_AA toFile:@"/tmp/testArchiver.txt"];
    //2. 从该路径中取出,读出
    NSMutableArray *array_CC = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/tmp/testArchiver.txt"];

属性类型copy

  • 在自定义的类中,要遵循 <NSCopying,NSMutableCopying>才能使用 [实例化对象 copy]这个实例化方法
  • 要去重写 copyWithZone方法实现复制
-(id)copyWithZone:(NSZone *)zone{
    DIY_Class *diyclass = [[DIY_Class allocWithZone:zone] init];
    return diyclass;
}
  • 自定义的类如果可能用于复制,那么其中的NSString等类型的@property最好要设置成 (nonatomic,copy)

推荐阅读更多精彩内容

  • 1. 属性中copy与strong特性的区别 在开始学习浅复制(Shallow Copy)、深复制(Deep Co...
    pro648阅读 1,044评论 2 16
  • 取月轻铃,如梦初醒。摘云煮茶,屋香人去。青阙点滴小星星,稚音待进心巧灵。 墨如浪奔,千字不绝。时如流霜,稍纵即...
    清涧骚人阅读 93评论 0 0
  • 520快到了 你呢 告白了吗 芒果是个爽快仗义的狮子座女孩,爱喝酒,一股子侠女味道,可是长的又特别娇小甜美,看着她...
    离楠阅读 198评论 0 0
  • 大标题 中标题 再来一个 asdf as dfsdf http://www.baidu.com Bird McH...
    夜息白鸽阅读 254评论 0 0
  • 周一休息 周二 背肌,斜方肌,三角肌后束。 周三休息 周四 胸肌,肱三头,三角肌前束,腹肌。 周五休息 周六 三角...
    shane911阅读 48评论 0 0