ShallowCopy与DeepCopy

来源:互联网 发布:tc软件 编辑:程序博客网 时间:2024/05/22 12:10

概念

浅层复制(copy):
只复制指向对象的指针,而不复制引用对象本身。
//通过对象的指针来访问这个对象—-只赋值地址
深层复制(mutableCopy):
复制引用对象本身—再创建一个对象 意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来 说,A和A_copy指向的是同一个内存资源,复制的 只不过是是一个指针,对象本身资源 还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一 个思想。深复制就好理解了,内存中存在了两份独立对象本身。
//当修改A时,A copy不变。
总结:简单点理解就是,浅拷贝就是你和你的影子,你没了你的影子也没了。
深拷贝就是你和你的克隆人,你没了你的克隆人还在。

Demo

  1. 对不可变的NSString:

    NSString *str1=@”test”;
    NSString *str2=[str1 copy];
    NSLog(@”str1===%@ str2===%@”,str1,str2);
    NSLog(@”str1===%p str2===%p”,str1,str2);
    结果:
    2015-09-19 20:52:42.617 deepCopy_shallowCopy[5807:570805] str1===test str2===test
    2015-09-19 20:52:42.617 deepCopy_shallowCopy[5807:570805] str1===0x1022110f8 str2===0x1022110f8

    NSString *str1=@”test”;
    NSString *str2=[str1 mutableCopy];
    NSLog(@”str1===%@ str2===%@”,str1,str2);
    NSLog(@”str1===%p str2===%p”,str1,str2);
    结果
    2015-09-19 20:53:23.633 deepCopy_shallowCopy[5826:571504] str1===test str2===test
    2015-09-19 20:53:23.634 deepCopy_shallowCopy[5826:571504] str1===0x103c0a0f8 str2===0x7fe443f2d6d0

  2. 对可变的NSMutableString:

    NSString *str1=@”test”;
    NSMutableString *str3=[str1 mutableCopy];
    NSMutableString *str4=[str3 mutableCopy];
    [str4 appendString:@”xzx”];
    NSLog(@”str3===%@ str4===%@ “,str3,str4);
    NSLog(@”str3===%p str4===%p “,str3,str4);
    结果:
    2015-09-19 21:04:20.447 deepCopy_shallowCopy[5978:577545] str3===test str4===testxzx
    2015-09-19 21:04:20.448 deepCopy_shallowCopy[5978:577545] str3===0x7fd478e14cb0 str4===0x7fd478e28710

    NSString *str1=@”test”;
    NSMutableString *str3=[str1 mutableCopy];
    NSMutableString *str4=[str3 copy];
    [str4 appendString:@”xzx”];
    NSLog(@”str3===%@ str4===%@ “,str3,str4);
    NSLog(@”str3===%p str4===%p “,str3,str4);
    结果:crash
    3.小结
    如果对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝)。如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的

0 0
原创粉丝点击