Objective-C中的深拷贝与浅拷贝

一、概念
  • 浅拷贝——只拷贝指向对象的指针,不拷贝引用对象本身。
  • 深拷贝——拷贝引用对象本身。
    将对象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]];

你可能感兴趣的:(Objective-C中的深拷贝与浅拷贝)