Copy Functions
在一般情况下,一个标准的复制操作,也可能被称为简单的任务,当您使用=操作符指定一个变量的值到另一个。例如,表达myInt2= myInt1导致整数内容的myInt1用于myInt1到由myInt2使用的内存的内存复制。两个独立的区域内存在复制操作,包含相同的值。然而,如果试图以这种方式复制的核心基础对象(Core Foundation object),要知道,你不会复制对象本身,只有引用(Reference)的对象。
例如,一个新核心基金可能会认为,为了使一个CFString对象的副本,她将使用表达式myCFString2= myCFString1的。再次,这表达不实际的字符串数据复制。因为myCFString1和myCFString2必须有CFStringRef的类型,这种表达只复制对象的引用。复制操作之后,你有两个副本的CFString。这种类型的副本是非常快的,因为只有引用(Reference)被复制,但重要的是要记住,复制在这样一个可变对象是危险的。方案,使用全局变量,如果一个应用程序的一部分,改变一个对象,使用引用(Reference)的副本,有没有其他地方的方案,其中有引用的副本,知道数据已经改变的方式。
如果你要复制一个对象,你必须使用由核心基金提供专门用于此目的的功能之一。继续与CFString例如,你将使用CFStringCreateCopy的创造一个全新的CFString对象包含相同的原始数据。 CreateCopy“功能也有提供核心基础类型的变种”CreateMutableCopy“,它返回一个可以修改的对象的副本。
Shallow Copy
复制复合对象,如集合对象,可以包含其他对象的对象,还必须进行谨慎。正如您所期望的那样,使用=操作符来执行重复的对象引用这些对象结果的副本。在对比简单像CFString和CFData对象,在“CreateCopy”提供的化合物,如CFArray和CFSet对象的功能实际执行浅拷贝。浅拷贝是指在这些对象的情况下,创建一个新的集合对象,但原始集合的内容不重复的对象引用复制到新的容器。这种类型的复制是非常有用的,例如,如果你有一个数组,是不可改变的,要重新排序。在这种情况下,你不希望重复所有包含的对象,因为没有必要改变他们,为什么使用了额外的内存?你想要的只是一套包括要改变的对象。在这里适用同样的风险与复制的简单类型的对象引用。
Deep Copy
当你想创建一个全新的复合对象,你必须执行一个深拷贝。一个深拷贝复制复合对象以及其包含的所有对象的内容。当前版本的核心基础,包括深执行的财产清单复制(见CFPropertyListCreateDeepCopy)的功能。如果你想创建其他结构的深拷贝,你可以执行深拷贝递归下降到复合对象和复制所有内容逐一自己。照顾,在执行此功能作为复合对象可以是递归,他们可能会直接或间接地包含了自己这可能会导致递归循环。
可简单的这样理解。
copy的目的 就是复制对象 也就是说要新建一个对象
不可变对象copy == 对象retain(内存优化机制的结果)
可变对象copy == 新建了个不可变对象
不可变/可变对象mutablecopy == 新建一个可变对象