首页 > 代码库 > 深拷贝&浅拷贝

深拷贝&浅拷贝

今天说一下深拷贝和浅拷贝  

声明本文仅供参考,因为作者能力有限不能做到十全十美,所以请大家指正错误的地方,欢迎大家提出问题,我回虚心接纳!

copy的目的是建立一个对象的副本,对其中一个对象进行修改时,不会影响到另外一个对象中的内容

 在iOS中copy包括:copy(拷贝) & mutableCopy(可变拷贝)

由于OC Foundation中对象类型通常包括不可变版本和可变版本,因此要试验copy操作需要测试几种形式:

 1> 可变 -> 可变        地址变化(新副本)

 2> 可变 -> 不可变        地址变化(新副本)

 3> 不可变 -> 可变        地址不变化

 4> 不可变 -> 不可变       地址不变化

下面我们来看代码:

void demoCopy1()

{   

 NSMutableString *strM = [NSMutableStringstringWithString:@"闪电霹雳"];

    // 1> 可变 -> 可变

    NSMutableString *strM1 = [strM copy];

//    [strM1 setString:@"hello"]; 

    NSLog(@"%@ %p - %@ %p", strM, strM, strM1, strM1);

    // 2> 可变 -> 不可变

    NSString *strM2 = [strM copy];

    NSLog(@"%@ %p - %@ %p", strM, strM, strM2, strM2);

    [strM setString:@"hello"];

    NSLog(@"%@ %p - %@ %p", strM, strM, strM1, strM1);

    NSLog(@"%@ %p - %@ %p", strM, strM, strM2, strM2);

}

这时候你会发现上面NSMutableSting拷贝过后就在strM1赋值的时候就会报错,第2>个也是给strM2赋值的时候也回报错

接下来再看案例2

void demoCopy2()

{

    NSString *str = @"闪电霹雳";

   // 1> 不可变 -> 可变

    NSMutableString *strM1 = [str copy];

//    [strM1 setString:@"hello"];

    NSLog(@"%@ %p - %@ %p", str, str, strM1, strM1);

    // 2> 不可变 -> 不可变

    NSString *strM2 = [str copy];

    NSLog(@"%@ %p - %@ %p", str, str, strM2, strM2);

}

 这时候同样,不管是NSMutableString还是Nstring拷贝过后的都不能再改变,同样不能赋值,如果赋值改变就会出错;

结论:使用Copy建立出来的都是不可变的的副本,与创建的副本类型无关;

接下来看事例3

void demoCopy3()

{

    NSMutableString *strM = [NSMutableStringstringWithString:@"可变字符串"];

    // 1> 可变 -> 可变

    NSMutableString *strM1 = [strM mutableCopy];

    [strM1 setString:@"hello strM1"];

    NSLog(@"%@ %p - %@ %p", strM, strM, strM1, strM1);

       // 2> 可变 -> 不可变

    NSString *strM2 = [strM mutableCopy];

    NSLog(@"%@ %p - %@ %p", strM, strM, strM2, strM2);

    id strM3 = strM2;

    [strM3 setString:@"hello strM2"];

      [strM setString:@"hello"];

    NSLog(@"%@ %p - %@ %p", strM, strM, strM1, strM1);

    NSLog(@"%@ %p - %@ %p", strM, strM, strM2, strM2);

}

 这次你回发现拷贝过后不管是哪一个类型都可改变;

结论:使用mutableCopy建立出来的都是可变副本,与创建副本的类型无关

好了,深拷贝浅拷贝到这里就OK了,有没有对copy有根深的一层了解呢?哈哈这里恭祝大家天天进步!!如有疑问可以联系我,我回尽自己的能力帮助大家!!