一、概念
- 淺拷貝——只拷貝指向?qū)ο蟮闹羔?,不拷貝引用?duì)象本身。
-
深拷貝——拷貝引用對(duì)象本身。
將對(duì)象obj,拷貝后得到obj-copy。對(duì)于淺拷貝來(lái)說(shuō),obj和obj-copy指向的是同一個(gè)內(nèi)存資源,拷貝的只是一個(gè)指針,對(duì)象資源還是只有一份。如果對(duì)obj-copy進(jìn)行修改,obj引用的對(duì)象也同樣被修改,因?yàn)閮蓚€(gè)指針指向的是同一個(gè)內(nèi)存資源。對(duì)于深拷貝來(lái)說(shuō),內(nèi)存中存在了兩份獨(dú)立的對(duì)象資源。
二、copy、mutableCopy
- 1、對(duì)于不可變的非集合對(duì)象,copy是淺拷貝,mutableCopy是深拷貝。
- 2、對(duì)于可變的非集合對(duì)象,copy、mutableCopy都是深拷貝。
- 3、對(duì)于不可變的數(shù)組、字典、集合等集合類對(duì)象,copy是淺拷貝,mutableCopy是深拷貝。
- 4、對(duì)于可變的數(shù)組、字典、集合等集合類對(duì)象,copy、mutableCopy都是深拷貝。
【注】對(duì)于集合對(duì)象的深拷貝,僅僅拷貝對(duì)象本身,對(duì)象里面的元素都是淺拷貝。想要深拷貝整個(gè)集合對(duì)象,就要用到集合類深拷貝的方法,有如下兩種:
(1)使用initWithArray:copyItems:、initWithDictionary:copyItems方法,將第二個(gè)參數(shù)設(shè)置為YES即可,例如:
NSArray *array = [[NSArray alloc] initWithArray:someArray copyItems:YES];
(2)將集合對(duì)象進(jìn)行歸檔(archive),然后解歸檔(unarchive),例如:
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:someArray]];