美文网首页
深拷贝和浅拷贝之容器类对象

深拷贝和浅拷贝之容器类对象

作者: 哲逗年 | 来源:发表于2017-06-23 11:39 被阅读0次
    还是那么美还是那么美

    1.对不可变对象进行copy操作

    @property (nonatomic, strong) NSArray *strongArray;
    NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"str1"];
    NSString *str2 = @"str2";
    NSString *str3 = @"str3";
    NSArray *array = @[str1,str2,str3];
    //等价于self.strongArray = [array copy];
    self.strongArray = array;
    NSLog(@"\narray:%p\nstrongArray:%p",array,self.strongArray);
    

    结果:两个数组地址是相同的,说明是浅copy,同时对两个数组的内部元素作打印,结果也是指向的同一份地址,说明数组里面的元素也是浅copy,建议用这种写法。
    结合上一章文章,对str1进行进一步的操作:
    1.[str1 appendString:@"append"];
    结果:可想而知两个数组里面的元素也随之改变
    2.str1 = [[NSMutableString alloc] initWithString:@"str6"];
    结果:可想而知两个数组里面的元素不会随之改变

    接下来将strongArray改为NSMutableArray会怎么样???
    结论其实是同上的,唯一不同的是如果对array进行copy时,进行如下操作:
    [self.strongArray removeLastObject];是会崩溃的喔,原因其实可以参考非容器类的那篇文章

    2.对不可变对象进行mutableCopy操作

    @property (nonatomic, strong) NSArray *strongArray;
    NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"str1"];
    NSString *str2 = @"str2";
    NSString *str3 = @"str3";
    NSArray *array = @[str1,str2,str3];
    self.strongArray = [array mutableCopy];
    NSLog(@"\narray:%p\nstrongArray:%p",array,self.strongArray);
    

    结果:两个数组地址是不一样的,说明对不可变对象进行mutableCopy是深copy,同时对两个数组内的元素作打印,结果是指向的同一份地址,说明数组里面的元素还是浅copy。

    接下来将strongArray改为NSMutableArray会怎么样???
    结果:结论同上,是内容copy(深copy),里面的元素都是指针copy(浅copy),但是可以对strongArray可以进行正常的增删操作。

    3.对可变对象进行copy操作

    @property (nonatomic, strong) NSArray *strongArray;
    NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"str1"];
    NSString *str2 = @"str2";
    NSString *str3 = @"str3";
    NSMutableArray *array = [NSMutableArray arrayWithArray:@[str1,str2,str3]];
    self.strongArray = [array copy];
    NSLog(@"\narray:%p\nstrongArray:%p",array,self.strongArray);
    

    结果:两个数组地址是不一样的,说明对可变对象进行copy操作,是内容copy(深copy);同是对两个数组的内部元素分别作打印,其实指向的都是同一份地址,说明数组里面的元素还是指针copy(浅copy)。

    接下来将strongArray改为NSMutableArray会怎么样???
    结论还是一样的,虽然strongArray定义是NSMutableArray,但是不可以进行[self.strongArray removeLastObject];等操作哦,因为编译时是没有任何问题的,但是一运行是会崩溃的。

    4.对可变对象进行mutableCopy操作

    @property (nonatomic, strong) NSArray *strongArray;
    NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"str1"];
    NSString *str2 = @"str2";
    NSString *str3 = @"str3";
    NSMutableArray *array = [NSMutableArray arrayWithArray:@[str1,str2,str3]];
    self.strongArray = [array mutableCopy];
    NSLog(@"\narray:%p\nstrongArray:%p",array,self.strongArray);
    

    结果:两个数组地址是不一样的,说明是内容copy(深copy),里面的元素是(指针copy)浅copy。
    ps:虽然对array进行了mutableCopy操作,但是strong是NSArray类型的,还是不可以增删操作的,因为编译的时候就会报错。

    接下来将strongArray改为NSMutableArray会怎么样???
    结果:结论同上,这种写法是最正确的,因为你可以正常对数组进行增删操作,并不会影响另一个数组,但是如果是修改数组里面的元素,是会影响的喔,因为是指针copy。

    相关文章

      网友评论

          本文标题:深拷贝和浅拷贝之容器类对象

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