首先呢,copy后得到的对象都是不可变的,mutableCopy后得到的对象都是可变的。
1、非容器对象(NSString)
(11) 如果源对象是不可变的:111. 那么copy后的对象(返回对象是不可变的)、源对象 都是同一个对象,对象的地址是一样的。既然指针地址都一样,那么指向的内容肯定也是一样的。俗称“浅拷贝”。Foundation框架中支持复制的类,默认是浅拷贝。
112. mutableCopy俗称“深拷贝”,会拷贝对象的地址以及内容,指针的地址(栈地址),指针指向的内容地址(堆地址)都会变。返回一个可变的对象。
(12) 如果源对象是可变的(NSMutableString):
121.这时候copy和mutableCopy都是深拷贝,会拷贝整个对象,对象的地址和内容都会拷贝。但是copy返回的对象是不可变的,文章开头已说明。
2、容器对象(NSArray、NSDictionary、NSSet等)
(21) 如果源对象是不可变的:
211. copy后,这一点和上面的111是一模一样的。
212. mutableCopy只拷贝对象的地址,但是容器的内容(即容器内的对象)并没有拷贝,指针指向的内容地址(堆地址)没有变,也就是说两个指针同时指向一块内存区域。返回一个可变的对象。那么我们要做到真正意义上的深拷贝(拷贝容器以及容器的内容),那么就得遍历容器,直到容器里面的对象不是容器对象为止,再把遍历后每一个对象进行mutableCopy,返回一个新的可变对象才对。
(22) 如果源对象是可变的:
221. 这时候copy和mutableCopy同样只拷贝对象的地址,但是容器的内容(即容器内的对象)并没有拷贝,指针指向的内容地址(堆地址)没有变,也就是说两个指针同时指向一块内存区域。返回一个可变的对象。那么我们要做到真正意义上的深拷贝(拷贝容器以及容器的内容),那么就得遍历容器,直到容器里面的对象不是容器对象为止,再把遍历后每一个对象进行mutableCopy,返回一个新的可变对象才对。