Copy iOS

作者: 下班不写程序 | 来源:发表于2019-04-08 22:52 被阅读0次

    1.什么是copy?

    copy语法的目的就是能够生成副本. 如果你想要创建一个对象, 且该对象与源对象相同, 这是就可以使用copy.

    2.什么是深/浅拷贝?

    深拷贝:内容拷贝,会产生新的的对象,新的对象的计数器值为1,源对象不变,源对象和副本对象是两个不同的对象.
    浅拷贝:指针拷贝,相当于做了一次retain操作,源对象的计数器值+1,没有产生新的对象,源对象和副本对象是同一个对象.

    一句话总结:\color{red}{除了 '不可变' 调用copy是浅拷贝,其他都是深拷贝.}

    3.copy和mutableCopy

    不管源对象是否为为可变, 经过copy之后, 副本对象都是不可变对象.
    不管源对象是否为为可变, 经过mutableCopy之后, 副本对象都是可变对象.

    注意1: 针对NSArray、NSDictionary等容器类型的对象,深拷贝可分为:"不完全深拷贝"和"完全深拷贝"。
    1.不完全深拷贝:拷贝出来的容器是新的对象(拷贝一个壳),但是容器里面的对象还是原来对象; 修改副本容器不会对容器产生影响, 但是通过容器对容器内部的obj进行修改,那么源容器中的obj也就随之更改了.
    2.完全深拷贝:拷贝出来的容器是新的对象,容器里面的对象也是新对象; 不论新的怎么修改,源的都不会有变化.

    4.单层深复制(不完全深拷贝)

    对于集合类的可变对象来说,深拷贝并非严格意义上的深复制,只能算是单层深复制,即虽然新开辟了内存地址,但是存放在内存上的值(也就是数组里的元素仍然之乡员数组元素值,并没有另外复制一份),这就叫做单层深复制.

    5.完全深复制

    完全深拷贝就是连同容器内的对象在内, 完完全全拷贝一份出来。

    注意: mutableCopyWithZone和copyWithZone: 一样是个待实现的方法,关键的区别在于内部实现的区别。默认情况下,copyWithZone: 做自定义对象的单层拷贝处理(有容器嵌套的化,只copy最外一层)。mutableCopyWithZone: 做自定义对象的完全拷贝处理(有容器嵌套的化,容器中每一层对象都做拷贝处理.
    .End

    相关文章

      网友评论

          本文标题:Copy iOS

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