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

浅拷贝和深拷贝

作者: 伦伦子_f7b3 | 来源:发表于2018-06-22 15:30 被阅读4次

    一.概念

          1.浅拷贝

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

    浅拷贝示意图

            浅拷贝就是拷贝指向原来对象的指针,使原对象的引用计数+1,可以理解为创建了一个指向原对象的新指针而已,并没有创建一个全新的对象

    2.深拷贝

            深拷贝是指复制对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

    深拷贝示意图

            深拷贝就是拷贝出和原来仅仅是值一样,但是内存地址完全不一样的新的对象,创建后和原对象没有任何关系。

    深拷贝就是内容拷贝,浅拷贝就是指针拷贝。

    本质区别在于:是否开启新的内存地址

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

     3.误区:认为copy是浅拷贝,mutableCopy是深拷贝

           上面这种理解是错误的,copy即可能是浅拷贝也可能是深拷贝,如果是深拷贝情况创建的对象是不可变对象,而mutableCopy是深拷贝,创建的对象是可变对象,可以修改。

    二.代码示例

          2.1 非集合对象的copy和mutableCopy

                   2.1.1  对不可变对象NSString进行copy和mutableCopy示例

    测试结果:

    分析:str1、str2地址相同并且与str3地址不同,NSString对象copy是浅拷贝,且copy返回的对象是不可变对象;mutableCopy是深拷贝,返回一个可变的对象,所以str3可以被修改,比如调用appendString方法追加。

               2.1.2  对可变对象NSMutableString进行copy和mutableCopy示例

    测试结果:

    分析:str1,str2,str3地址都不同,NSMutableString对象copy与mutableCopy都是深拷贝,但是copy返回的对象是不可变对象,不可以修改,如果调用appendString之类的方法去修改会报错;mutableCopy,返回一个可变的对象,所以str3可以被修改,比如调用appendString方法追加。

          2.2 对集合对象的copy和mutableCopy(以NSArray和NSMutableArray为例)

                    2.2.1 对不可变数组NSArray对象进行copy和mutableCopy操作示例

    测试结果:

    分析:arry1、arry2 地址一样,arr3 地址不一样,NSArray的copy是浅拷贝,且copy返回的对象是不可变对象;mutableCopy是深拷贝,返回的对象为可变对象,可以进行修改。

              2.2.2 对可变数组NSMutableArray对象进行copy和mutableCopy操作示例

    测试结果:

    分析:arry1、arry2、arr3 地址都不一样,NSMutableArray对象copy与mutableCopy都是深拷贝,但是copy返回的对象是不可变对象,mutableCopy返回的是可变对象。

    相关文章

      网友评论

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

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