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

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

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

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

(二)对象复制方法

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值