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

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

你可能感兴趣的:(About Copy —— 复制)