1茂嗓、使對(duì)象具有拷貝功能
在自定義的類里面實(shí)現(xiàn)NSCopying協(xié)議和NSMutableCopying協(xié)議餐茵,若沒有實(shí)現(xiàn)這兩個(gè)協(xié)議的話,在實(shí)例化對(duì)象后調(diào)用copy/mutableCopy會(huì)報(bào)錯(cuò)在抛。
為什么要使用copy钟病?
copy是創(chuàng)建一個(gè)新對(duì)象,retain是創(chuàng)建一個(gè)指針刚梭,引用對(duì)象計(jì)數(shù)加1。copy屬性表示兩個(gè)對(duì)象內(nèi)容相同票唆,新的對(duì)象引用為1?朴读,與舊有對(duì)象的引用計(jì)數(shù)無關(guān),舊的對(duì)象并沒有變化走趋。copy減少對(duì)象對(duì)上下文的依賴衅金。copy過后的新對(duì)象會(huì)開辟新的內(nèi)存空間。
對(duì)于系統(tǒng)的非容器類對(duì)象(NSArray、NSMutableArray氮唯、NSDictionary鉴吹、NSMutableDictionary等),可以認(rèn)為惩琉,如果對(duì)一不可變對(duì)象復(fù)制豆励,copy是指針復(fù)制(淺拷貝)而mutableCopy就是對(duì)象復(fù)制(深拷貝)。如果是對(duì)可變對(duì)象復(fù)制瞒渠,都是深拷貝良蒸,但是copy返回的對(duì)象是不可變的。
copy:對(duì)于可變對(duì)象為深復(fù)制伍玖,引用計(jì)數(shù)不改變;對(duì)于不可變對(duì)象是淺復(fù)制嫩痰。引用計(jì)數(shù)每次+1。始終返回一個(gè)不可變對(duì)象窍箍。
mutableCopy:始終是深復(fù)制串纺,引用計(jì)數(shù)不改變。始終返回一個(gè)可變對(duì)象
那么先讓我們來看一看下數(shù)組類型的轉(zhuǎn)換
1椰棘、不可變對(duì)象→可變對(duì)象的轉(zhuǎn)換:
???????NSArray?*arr1= [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",nil];
?????NSMutableArray?*arr2=[arr1?mutableCopy];
2纺棺、可變對(duì)象→不可變對(duì)象的轉(zhuǎn)換:
????NSMutableArray?*array1 ? = [NSMutableArray?arrayWithObjects:@"a1",@"b1",@"c1",@"d1",nil];
???????NSArray?*array2=[?array1 ? Copy];
3、可變對(duì)象→可變對(duì)象的轉(zhuǎn)換(不同指針變量指向不同的內(nèi)存地址):
???????NSMutableArray?*array1= [NSMutableArray?arrayWithObjects:@"a",@"b",@"c",@"d",nil];
?????NSMutableArray?*array2=[array1?mutableCopy];
通過上邊的兩個(gè)例子晰搀,我們可輕松的將一個(gè)對(duì)象在可變和不可變之間轉(zhuǎn)換五辽,并且這里不用考慮內(nèi)存使用原則(即引用計(jì)數(shù)的問題)。沒錯(cuò)外恕,這就是深拷貝的魅力了杆逗。
4、同類型對(duì)象之間的指針復(fù)制(不同指針變量指向同一塊內(nèi)存地址):
??a鳞疲、
?NSMutableString?*str1=[NSMutableString?stringWithString:@"two day"];
???NSMutableString?*str2=[str1??retain];
b罪郊、
???NSArray?*array1= [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];
???NSArray?*str2=[array1?Copy];
?通俗的講,多個(gè)指針同時(shí)指向同一塊內(nèi)存區(qū)域尚洽,那么這些個(gè)指針同時(shí)擁有對(duì)該內(nèi)存區(qū)的所有權(quán)悔橄。所有權(quán)的瓜分過程,這時(shí)候就要用到淺拷貝了腺毫。
可以把上面所有的問題則簡(jiǎn)化如下:
什么時(shí)候用到深淺拷貝癣疟?
深拷貝(mutableCopy)是在要將一個(gè)對(duì)象從可變(不可變)轉(zhuǎn)為不可變(可變)或者將一個(gè)對(duì)象內(nèi)容克隆一份時(shí)用到;
淺拷貝(copy)是在要復(fù)制一個(gè)對(duì)象的指針時(shí)用到潮酒。
對(duì)可變對(duì)象使用 copy 和MutableCopy 都會(huì)拷貝一個(gè)新的對(duì)象出來,即,copy 和 mutableCopy 都是深拷貝;
對(duì)不可變對(duì)象使用 copy, 新拷貝出來的對(duì)象地址和被拷貝對(duì)象地址一致?
對(duì)不可變對(duì)象使用 mutableCopy 新拷貝出來的對(duì)象和被拷貝的對(duì)象內(nèi)存地址發(fā)生變化,?
所以對(duì)不可變對(duì)象 copy 就是淺拷貝,mutableCopy 就是深拷貝.?