美文网首页
iOS 深拷贝也浅拷贝

iOS 深拷贝也浅拷贝

作者: Q妹_ | 来源:发表于2019-12-11 17:58 被阅读0次

    一. 拷贝的目地是什么?

    拷贝的目地是产生一个副本对象,跟源对象互不影响
    改变源对象不影响副本
    改变副本对象,不影响源对象

    iOS提供两个拷贝方法
    1.copy 不可变拷贝,产生不可变副本
    2.mutablecopy 可变拷贝,产生可变副本

        NSString *str = [[NSString alloc] initWithFormat:@"test"];
        NSString *str1 = [str copy];
        NSString *str2 = [str mutableCopy];
        NSLog(@"%p",str);
        NSLog(@"%p",str1);
        NSLog(@"%p",str2);
    

    不可变对象进行copy产生的是不可变对象,源对象本身也不可变,就不会出现被修改的情况,所以返回回来的是本身,两个对象指向一块内存

    //打印结果
    2019-12-08 22:12:54.055760+0800 TestDemo[4293:181329] 0x100c181b8
    2019-12-08 22:12:54.055897+0800 TestDemo[4293:181329] 0x100c181b8
    2019-12-08 22:12:54.056238+0800 TestDemo[4293:181329] 0x60000243c0c0
    
    image.png

    NSMutableString

     NSMutableString *str = [NSMutableString stringWithFormat:@"test"];
        NSString *str1 = [str copy];
        NSMutableString *str2 = [str mutableCopy];
        NSLog(@"%p",str);
        NSLog(@"%p",str1);
        NSLog(@"%p",str2);
    
    //打印结果
    2019-12-08 22:31:35.812314+0800 TestDemo[4474:194204] 0x6000028cae20
    2019-12-08 22:31:35.812444+0800 TestDemo[4474:194204] 0xc95bad41985c61a8
    2019-12-08 22:31:35.812520+0800 TestDemo[4474:194204] 0x6000028cad90
    

    可以看出内存地址都不一样

    image.png

    mutalecopy 产生的是可变对象,就会出现被修改的情况,为了避免修改可变对象的值时影响源对象,所以拷贝出一块新的内存

    对可变对象不管是进行copy 还是mutablecopy都会复制一块新的内存

    总结

    image.png

    相关文章

      网友评论

          本文标题:iOS 深拷贝也浅拷贝

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