美文网首页
深拷贝与浅拷贝

深拷贝与浅拷贝

作者: LT_9999 | 来源:发表于2023-02-12 00:03 被阅读0次

    赋值是和原对象指向同一内存,属于同一对象
    浅拷贝拷贝对象,是新生成一个指针与原对象指向同一段内存
    1、浅拷贝
    浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针。

    深拷贝拷贝对象本身以及属性 ,对象包含子对象时,拷贝的对象改变,原对象的子对象不会改变;

    使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。

    浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。

    深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。

    总结:

    深拷贝就是内容拷贝,浅拷贝就是指针拷贝。本质区别在于:
    

    是否开启新的内存地址
    是否影响内存地址的引用计数

    - (void) mutableNSStringTest
    {
        NSMutableString *mstr1 = [NSMutableString stringWithString:@"test002"];
        
        NSMutableString *mstr2 = [mstr1 copy];
        //copy返回的是不可变对象,mstr2不能被修改,因此会发生崩溃
        //[str2 appendString:@"test"];
        
        NSMutableString *mstr3 = [mstr1 mutableCopy];
        [mstr3 appendString:@"modify"];
        
        NSLog(@"mstr1:%p - %@ \r\n",mstr1,mstr1);
        NSLog(@"mstr2:%p - %@ \r\n",mstr2,mstr2);
        NSLog(@"mstr3:%p - %@ \r\n",mstr3,mstr3);
    }
    

    分析:mstr1、mstr2、mstr3 地址都不同,NSMutableString对象copy与mutableCopy都是深拷贝,且copy返回的对象是不可变对象。

    No1:可变对象的copy和mutableCopy方法都是深拷贝(区别完全深拷贝与单层深拷贝) 。

    No2:不可变对象的copy方法是浅拷贝,mutableCopy方法是深拷贝。

    No3:copy方法返回的对象都是不可变对象。

    image.png

    相关文章

      网友评论

          本文标题:深拷贝与浅拷贝

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