1.什么是copy?
copy语法的目的就是能够生成副本. 如果你想要创建一个对象, 且该对象与源对象相同, 这是就可以使用copy.
2.什么是深/浅拷贝?
深拷贝:内容拷贝,会产生新的的对象,新的对象的计数器值为1,源对象不变,源对象和副本对象是两个不同的对象.
浅拷贝:指针拷贝,相当于做了一次retain操作,源对象的计数器值+1,没有产生新的对象,源对象和副本对象是同一个对象.
一句话总结:
3.copy和mutableCopy
不管源对象是否为为可变, 经过copy之后, 副本对象都是不可变对象.
不管源对象是否为为可变, 经过mutableCopy之后, 副本对象都是可变对象.
注意1: 针对NSArray、NSDictionary等容器类型的对象,深拷贝可分为:"不完全深拷贝"和"完全深拷贝"。
1.不完全深拷贝:拷贝出来的容器是新的对象(拷贝一个壳),但是容器里面的对象还是原来对象; 修改副本容器不会对容器产生影响, 但是通过容器对容器内部的obj进行修改,那么源容器中的obj也就随之更改了.
2.完全深拷贝:拷贝出来的容器是新的对象,容器里面的对象也是新对象; 不论新的怎么修改,源的都不会有变化.
4.单层深复制(不完全深拷贝)
对于集合类的可变对象来说,深拷贝并非严格意义上的深复制,只能算是单层深复制,即虽然新开辟了内存地址,但是存放在内存上的值(也就是数组里的元素仍然之乡员数组元素值,并没有另外复制一份),这就叫做单层深复制.
5.完全深复制
完全深拷贝就是连同容器内的对象在内, 完完全全拷贝一份出来。
注意: mutableCopyWithZone和copyWithZone: 一样是个待实现的方法,关键的区别在于内部实现的区别。默认情况下,copyWithZone: 做自定义对象的单层拷贝处理(有容器嵌套的化,只copy最外一层)。mutableCopyWithZone: 做自定义对象的完全拷贝处理(有容器嵌套的化,容器中每一层对象都做拷贝处理.
.End
网友评论