1、拷贝的目的:产生一个副本对象,跟源对象互不影响(修改了源对象不会影响副本对象;修改了副本对象不会影响源对象)
2、iOS中提供了两个拷贝方法
(1)copy:不可变拷贝,产生不可变副本;
(2)mutableCopy:可变拷贝,产生可变副本;
3、“深拷贝”和“浅拷贝”
1.浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个内存地址
2.深拷贝是真正的复制了一份,复制的对象指向了新的内存地址
浅拷贝好比你的影子,你死了,影子也没了;深拷贝好比克隆人,你死了,它还在。(浅拷贝:只拷贝指针,不拷贝对象。深拷贝:只拷贝对象,不拷贝指针。只有不可变类型进行不可变拷贝才是浅拷贝,其余都是深拷贝)
一、非容器不可变对象:NSString
1.对于非容器不可变对象的copy为浅拷贝,mutableCopy为深拷贝
2.浅拷贝获得的对象地址和原对象地址一致, 返回的对象为不可变对象
3.深拷贝返回新的内存地址,返回对象为可变对象
二、非容器可变对象: NSMutableString
1.对于非容器可变对象的copy为深拷贝,mutableCopy为深拷贝
2.copy返回新的内存地址,返回对象为可变对象
3.mutableCopy返回新的内存地址,返回对象为可变对象
三、容器类不可变对象: NSArray
1.对于容器类不可变对象的copy为浅拷贝,mutableCopy为深拷贝
2.浅拷贝获得的对象地址和原对象地址一致, 返回的对象为不可变对象
3.深拷贝返回新的内存地址,返回对象为可变对象,但容器内的元素仍然是浅拷贝
四、容器类可变对象: NSMutableArray
1.对于容器类可变对象的copy为深拷贝,mutableCopy为深拷贝
2.copy返回新的内存地址,返回的对象为不可变对象,但容器内的元素仍然是浅拷贝
3.mutableCopy返回新的内存地址,返回对象为可变对象,但容器内的元素仍然是浅拷贝
五、用户自定义了一个对象,如何实现拷贝(可变和不可变拷贝)
只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。