深复制和浅复制
1、概述
对象拷贝有两种方式:浅复制和深复制。
浅复制:拷贝指针
深复制:拷贝整个对象
2、深浅复制(copy、mutableCopy)
-
不管是集合类对象,还是非集合类对象,接收到copy和mutableCopy消息时,都遵循以下准则:
copy返回imutable对象(不可变对象);所以,如果对copy返回值使用mutable对象接口就会crash;
mutableCopy返回mutable对象;
在非集合类对象中:对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copy和mutableCopy都是内容复制。
在集合类对象中,对immutable对象进行copy,是指针复制,mutableCopy是内容复制;对mutable对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。
3、property里的copy和strong区别
总结
NSString用copy修饰时,将一个可变字符串的值赋给它,此时copy属性字符串已不再指向string字符串对象,而是深拷贝了string字符串。
-
NSString用strong修饰时,将一个可变字符串赋值给它,此时strong属性字符串只不过是引用计数加1。
将不可变字符串赋值给它,此时copy只做了浅拷贝。
NSArray *arr = @[@"21312",@"22"];
NSArray *copyarr = arr;
NSMutableArray *muarr = [arr mutableCopy];
NSLog(@"%p---%p---%p----%@----%@",arr,copyarr,muarr,arr,copyarr);
0x6080000258c0---0x6080000258c0---0x6080000598f0----(
21312,
22
)----(
21312,
22
)