美文网首页
iOS 之深浅拷贝

iOS 之深浅拷贝

作者: 碎梦_aimee | 来源:发表于2019-08-16 16:46 被阅读0次

    1. 深浅copy的本质区别:

    浅copy VS 深copy
    • 深copy: 在拷贝对象自身的时候,将底层数据也进行了复制过去。
    • 浅copy: 只拷贝容器本身,不拷贝其中的数据(只拷贝指针)
    深copy

    打印输出结果:


    输出结果:深copy内存地址会改变

    由此可见:

    两个数组虽然数据一致,但是所指的内存地址不同,说明 mutableCopy 在copy的时候,进行了深copy,把array的底层数据也进行了一份copy;如果使用的浅copy,生成新的指针,指向同一个内存地址。

    2.copy的几种具体使用情况

    • 字符串和容器数据的copy:

    • 可变的容器数据进行内容操作的时候,根据深浅copy,结果会不同

    可变数组array,通过浅copy后生成数组array1,然后在给array新增数据

    打印结果:


    ADC727BA-8586-4C6A-9907-9DD4259734CD.png
    • 如果是自定义的类,一般需要遵从<NSCopying>协议,才能对其进行copy操作,一般是使用的浅copy

    <NSCopying> 协议 一般通过- (id)copyWithZone:(NSZone *)zone 方法实现

    • 如果是给指针重新赋值,则会改变其内存地址,指向新的数据所在内存
    NSString * str = @"哈哈哈";
     NSString * str2 = str; //这个操作和copy是一样的处理
     NSLog(@"打印出对应的自身地址2%p  内容指针%p  内容=%@",&str2,str2,str2);
     str2 = @"嘻嘻嘻嘻"; //同一个指针,指向不同的内容地址
     NSLog(@"打印出对应的自身地址2%p  内容指针%p  内容=%@",&str2,str2,str2);
        NSLog(@"打印出对应的自身地址2%p  内容指针%p  内容=%@",&str,str,str);
    

    输出结果:

    打印出对应的自身地址20x7ffee6d25960 内容指针0x108ed9078 内容=哈哈哈
    打印出对应的自身地址20x7ffee6d25960 内容指针0x108ed90d8 内容=嘻嘻嘻嘻
    打印出对应的自身地址20x7ffee6d25968 内容指针0x108ed9078 内容=哈哈哈

    原始str 与 str2 是 两个指向同一个内存地址的指针,但是在修改了str2 值后,str2指向了新的内存地址

    相关文章

      网友评论

          本文标题:iOS 之深浅拷贝

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