深拷贝与浅拷贝的解析 (学习日记)

来源:互联网 发布:知其雄守其雌曾国藩 编辑:程序博客网 时间:2024/06/07 10:23

(一)深拷贝,浅拷贝定义

浅拷贝是当对象的属性是指针变量时,如果程序只是复制该指针的地址,而不是真正复制指针所指向的对象,这种方式就被称为浅拷⻉。

深拷贝不仅会复制对象本⾝,而且会递归复制每个指针类型的属性,直到两个对象没有任何的共用部分为⽌

(二)对象复制方法

NSObject类提供了copymutableCopy方法,通过这两个方法即可复制已有对象的副本

当程序调⽤用对象的copy⽅方法来复制对象时,程序底层需要调⽤用copyWithZone⽅方法来完成实际的复制⼯工作,copy返回的实际上就是copyWithZone⽅方法的返回值,为了保证⼀一个对象可调⽤用copy⽅方法来复制⾃自⾝身的不可变副本,通常需要做如下事情

 让类实现NSCopying协议
 让类实现copyWithZone⽅方法 

当程序调⽤用对象的mutableCopy⽅方法来复制对象时,程序底层需要调⽤用mutableCopyWithZone⽅方法来完成实际的复制⼯工作,mutableCopy实际上就是返回mutableCopyWithZone⽅方法的返回值 ,为了保证⼀一个对象可调⽤用mutableCopy⽅方法来复制⾃自⾝身的可变副本,通常需要做如下事情

让类实现NSMutableCopying协议
让类实现mutableCopyWithZone⽅方法 

iOS  SDK中常⽤用的可复制对象有:NSNumberNSStringNSArrayNSDictionaryNSMutableDictionaryNSMutableArrayNSMutableString 。

(三)拷贝实现(非容器类)(main 在非ARC下打印地址)


结果:


由此可知,复制非容器类对象时,copy是指针复制,即浅拷贝。而mutableCopy是对象拷贝,即深拷贝。

(四)拷贝实现(容器类)(main 在非ARC下打印地址)

  • (1)copy

    实现协议时,对象用copy:



    实现协议时,对象用mutableCopy



    对于容器类对象,copy将容器对象复制了,但容器里的对象与非容器一样,copy在这里只是指针复制,mutableCopy是对象复制。

    (2)mutableCopy


    实现协议时,对象用copy:



    实现协议时,对象用赋值法


    实现协议时,对象用mutableCopy:


    结论:

    对于容器类对象,mutableCopy也将容器对象复制了,但容器里的对象与非容器一样,copy在这里只是指针复制,mutableCopy是对象复制。还有,赋值法默认是copy,即浅拷贝。



2 0
原创粉丝点击