深浅copy
浅拷贝:指针拷贝,复制一个新的指针,指向同一块内存区域。实际内存并没有发生拷贝
深拷贝:内容拷贝,拷贝数据到一块新内存区域,指针指向拷贝的数据区
浅复制很简单,只是简单的指针拷贝,所以改变原对象或者拷贝后的对象,都会影响另外一个对象。
为什么NSString的属性关键字一定要用copy呢?我用Strong不行吗?
strong会有一个问题,如果我用一个mutablestring赋值给这个strong属性,然后我修改这个mutablestring,你这个strong属性就会被修改,就不安全了,是不期望的结果。copy就没有这个问题。
@property(nonatomic,strong)NSString *tempStr;
NSMutableString *str = [[NSMutableString alloc]initWithString:@"1111"];
self.tempStr = str;
[str appendString:@"11123"];
NSLog(@"%@",self.tempStr);
输出111111123
copy: 对于可变对象为深拷贝,对于不可变对象为浅拷贝
mutableCopy:始终是深拷贝
在OC中不是所有的类都支持拷贝,只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。
如果是自定义类对象 需要遵循<NSCoding>否则在使用NSKeyedArchiver的时候会Crash。(完全拷贝NSKeyedUnarchiver)
1、retain是对当前对象增加了一个指针指向,使对象的引用计数器加1, 是进行了一次安全的浅拷贝操作。
2、copy是对当前对象进行了一次拷贝,重新拷贝了当前对象,当使用的时候减少了对当前对象的依赖。
浅拷贝:只是复制容器本身,不会复制容器内部的元素,浅拷贝后生成的新容器对象和原始容器对象共享内部元素
深拷贝:不仅复制容器本身,容器内部的元素也会复制,深拷贝后生成的新容器对象和原始容器的内部元素是独立的。
copy:不可变拷贝,遵循NSCopying协议,需要对应实现copyWithZone方法
mutableCopy:可变拷贝,遵循NSMutableCopying协议,需要对应实现mutableCopyWithZone:方法