Objective-C中的深拷贝与浅拷贝
2021-12-28 本文已影响0人
兰帕德
一、概念
- 浅拷贝——只拷贝指向对象的指针,不拷贝引用对象本身。
-
深拷贝——拷贝引用对象本身。
将对象obj,拷贝后得到obj-copy。对于浅拷贝来说,obj和obj-copy指向的是同一个内存资源,拷贝的只是一个指针,对象资源还是只有一份。如果对obj-copy进行修改,obj引用的对象也同样被修改,因为两个指针指向的是同一个内存资源。对于深拷贝来说,内存中存在了两份独立的对象资源。
二、copy、mutableCopy
- 1、对于不可变的非集合对象,copy是浅拷贝,mutableCopy是深拷贝。
- 2、对于可变的非集合对象,copy、mutableCopy都是深拷贝。
- 3、对于不可变的数组、字典、集合等集合类对象,copy是浅拷贝,mutableCopy是深拷贝。
- 4、对于可变的数组、字典、集合等集合类对象,copy、mutableCopy都是深拷贝。
【注】对于集合对象的深拷贝,仅仅拷贝对象本身,对象里面的元素都是浅拷贝。想要深拷贝整个集合对象,就要用到集合类深拷贝的方法,有如下两种:
(1)使用initWithArray:copyItems:
、initWithDictionary:copyItems
方法,将第二个参数设置为YES即可,例如:
NSArray *array = [[NSArray alloc] initWithArray:someArray copyItems:YES];
(2)将集合对象进行归档(archive),然后解归档(unarchive),例如:
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:someArray]];