什么是文件拷贝
我们在使用电脑的时候,经常会有一个操作,就是ctrl+c和ctrl+v,就是拷贝。
这个拷贝的结果,就是产生一个副本,该副本与源文件完全一致,而且两者互不影响。
修改源文件,不会影响副本文件,而修改副本文件也不会影响源文件。
我们也将这种操作成为克隆
什么是对象拷贝
对象拷贝与文件拷贝类似,新对象与源对象互不影响
深拷贝&浅拷贝
浅拷贝:指针拷贝
深拷贝:堆内容拷贝
ios拷贝的两种方式
1.copy不可变拷贝,产生不可变副本(划重点)
2.mutableCopy可变拷贝,产生可变副本(划重点)
自定义对象类型
对象类型要想支持拷贝,就需要实现NSCopying接口,自定义对象的copy或者mutablecopy都是深拷贝,也就是内存拷贝
自定义容器对象
对容器对象中的数据进行深拷贝,只能使用alloc initwitharray copyItems:yes
不过一般来说不建议这样做,nsarray数据对象太大,深拷贝导致内存读写太频繁,在上层进行深拷贝,就不需要alloc太大的内存空间,性能更快
引申
本文描述的是ios的深浅拷贝,其实,c/c++/python/js/java等各个语言都有深浅拷贝。其原理也很简单:
浅拷贝是指针拷贝,深拷贝是副本拷贝。
如果理解变量的创建过程,就能顺理成章的理解了,那就是创建变量意味着栈中和堆中都开辟空间,堆中存储变量值,栈中存储指针,指向堆中的值