iOS中拷贝分为两种,深拷贝(mutableCopy)和浅拷贝(copy)。
概念
深拷贝:创建一个新的指针,并开辟新的内存空间,内容拷贝自原指针指向的内存,并指向它
浅拷贝:只创建一个新的指针,指向原指针指向的内存
需要注意的是在定义属性的时候有copy修饰符,这个修饰符与浅拷贝copy意义是不一样的。浅拷贝是拷贝的过程,而修饰符copy指的是要做拷贝操作,具体深拷贝还是浅拷贝需要区分不同的情况
copy | mutableCopy | |
---|---|---|
NSString | NSString 浅拷贝 |
NSMutableString 深拷贝 |
NSMutableString | NSString 深拷贝 |
NSMutableString 深拷贝 |
NSArray | NSArray 浅拷贝 |
NSMutableArray 深拷贝 |
NSMutableArray | NSArray 深拷贝 |
NSMutableArray 深拷贝 |
NSDictionary | NSDictionary 浅拷贝 |
NSMutableDictionary 深拷贝 |
NSMutableDictionary | NSDictionary 深拷贝 |
NSMutableDictionary 深拷贝 |
对集合类进行mutableCopy时,虽然新建了个集合类对象,但是集合内存储的元素内存地址没有变化。也就是说深拷贝值只能拷贝对象本身,对象内部元素仍然是浅拷贝
想要对集合类对象内部的元素进行深拷贝可以使用如下方法
NSMutableArray *arr2 = [[NSMutableArray alloc]initWithArray:arr copyItems:YES];
NSArray *arr3 = [[NSArray alloc] initWithArray:arr copyItems:YES];
NSDictionary *dict1 = [[NSDictionary alloc]initWithDictionary:dict copyItems:YES];
设置copyItems为yes只能保证对集合内元素进行深拷贝,但是集合内元素若还是集合类型。那它的集合类型内部元素仍是浅拷贝
可以通过归档解档的方式实现完全的深拷贝
自定义类如果需要copy操作,需要两步
1.让类实现NSCopying/NSMutableCopying协议。
2.让类实现copyWithZone:/mutableCopyWithZone:方法