iOS中拷貝分為兩種,深拷貝(mutableCopy)和淺拷貝(copy)。
概念
深拷貝:創(chuàng)建一個(gè)新的指針,并開辟新的內(nèi)存空間,內(nèi)容拷貝自原指針指向的內(nèi)存,并指向它
淺拷貝:只創(chuàng)建一個(gè)新的指針,指向原指針指向的內(nèi)存
需要注意的是在定義屬性的時(shí)候有copy修飾符,這個(gè)修飾符與淺拷貝copy意義是不一樣的。淺拷貝是拷貝的過程,而修飾符copy指的是要做拷貝操作,具體深拷貝還是淺拷貝需要區(qū)分不同的情況
| copy | mutableCopy | |
|---|---|---|
| NSString | NSString 淺拷貝 |
NSMutableString 深拷貝 |
| NSMutableString | NSString 深拷貝 |
NSMutableString 深拷貝 |
| NSArray | NSArray 淺拷貝 |
NSMutableArray 深拷貝 |
| NSMutableArray | NSArray 深拷貝 |
NSMutableArray 深拷貝 |
| NSDictionary | NSDictionary 淺拷貝 |
NSMutableDictionary 深拷貝 |
| NSMutableDictionary | NSDictionary 深拷貝 |
NSMutableDictionary 深拷貝 |
對集合類進(jìn)行mutableCopy時(shí),雖然新建了個(gè)集合類對象,但是集合內(nèi)存儲的元素內(nèi)存地址沒有變化。也就是說深拷貝值只能拷貝對象本身,對象內(nèi)部元素仍然是淺拷貝
想要對集合類對象內(nèi)部的元素進(jìn)行深拷貝可以使用如下方法
NSMutableArray *arr2 = [[NSMutableArray alloc]initWithArray:arr copyItems:YES];
NSArray *arr3 = [[NSArray alloc] initWithArray:arr copyItems:YES];
NSDictionary *dict1 = [[NSDictionary alloc]initWithDictionary:dict copyItems:YES];
設(shè)置copyItems為yes只能保證對集合內(nèi)元素進(jìn)行深拷貝,但是集合內(nèi)元素若還是集合類型。那它的集合類型內(nèi)部元素仍是淺拷貝
可以通過歸檔解檔的方式實(shí)現(xiàn)完全的深拷貝
自定義類如果需要copy操作,需要兩步
1.讓類實(shí)現(xiàn)NSCopying/NSMutableCopying協(xié)議。
2.讓類實(shí)現(xiàn)copyWithZone:/mutableCopyWithZone:方法