• 【ObjectC—浅copy和深copy】


    一、OC设计copy的目的

      为了能够从源对象copy一个新的对象副本,改变新对象(副本)的时候,不会影响到原来的对象。

    二、实现copy协议

      OC提供了两种copy方法:copy和mutableCopy,一个对象要想使用copy方法必须实现NSCoppying协议,想使用mutabCopy必须实现NSMutableCopying协议。

    三、copy的作用

     

    从上面这个图我们可以看出,其实创建可变或不可变对象跟源对象没有关系,而跟复制的方式有关系。以NSString为例分情况说明下:

    1)NSString调用copy方法

      是浅拷贝,出于对性能的考虑,只是对源对象计数器+1(相当于retain),并没有产生新的对象。

    2)NSMutableString调用copy方法

      是深拷贝,产生一个不可变的副本,源对象的计数器不变,新产生对象的计数器为1。

    3)NSString调用MutableCopy方法

      是深copy,产生一个可变的副本,源对象的计数器不变,新产生对象的计数器为1。

    4)NSMutableString调用MutableCopy方法

      是深copy

    由此可见,除了NSstring的copy方法是浅copy,其他三种情况都是深copy。

    总结来说:

    1)深copy:也就是内容copy,会从源对象复制一份新的对象出来,新对象计数器为1,源对象的计数器不发生变化。

    2)浅copy:也就是指针copy,只是将指针复制一份给对象,源对象计数器会+1,通常相当于对象retain操作。

    四、自定义对象实现copy

    分两步走:

    1)实现copyying(mutableCopying)协议。

    2)实现copyWithZone方法。

  • 相关阅读:
    编写一个函数func(),将此函数的输入参数(int型)逆序输出显示,如54321 –> 12345,要求使用递归,并且函数体代码不超过8行
    java中两种单例模式
    springMVC配置freemarker 二(问题讨论篇)
    springMVC配置freemarker
    java中@value的环境配置
    java环境log4j日志环境的配置。
    websocket协议
    http报文和浏览器缓存机制
    详解网络连接
    编码总结
  • 原文地址:https://www.cnblogs.com/zhouliweiblog/p/4967082.html
Copyright © 2020-2023  润新知