一般來(lái)說(shuō)规婆,復(fù)制一個(gè)對(duì)象包括創(chuàng)建一個(gè)新的實(shí)例耸峭,并用原始對(duì)象中的值來(lái)初始化這個(gè)新的實(shí)例桩蓉。復(fù)制非指針型的對(duì)象比較簡(jiǎn)單,例如int劳闹,float院究,BOOL等。復(fù)制指針型的對(duì)象有淺復(fù)制和深復(fù)制兩種方法本涕。
1业汰、深復(fù)制與淺復(fù)制的簡(jiǎn)介
針對(duì)指針型對(duì)象的拷貝,有淺復(fù)制和深復(fù)制兩種偏友。
淺復(fù)制:將原始對(duì)象的指針值復(fù)制到副本中蔬胯,即指針拷貝,原始對(duì)象和副本共享引用的數(shù)據(jù)位他;相當(dāng)于創(chuàng)建了一個(gè)文件的快捷方式氛濒。
深復(fù)制:復(fù)制原始對(duì)象指針?biāo)玫臄?shù)據(jù),并將其賦給副本對(duì)象鹅髓,即內(nèi)容拷貝舞竿,相當(dāng)于創(chuàng)建了一份新的文件。
例如窿冯,當(dāng)我們?yōu)橐粋€(gè)類的屬性添加copy關(guān)鍵字時(shí)骗奖,那么對(duì)這個(gè)屬性賦值時(shí)(即:調(diào)用setter方法),就會(huì)執(zhí)行深拷貝操作醒串。當(dāng)我們把屬性關(guān)鍵字改為strong或者weak時(shí)执桌,那么對(duì)這個(gè)屬性賦值時(shí),就會(huì)執(zhí)行淺拷貝(只拷貝指針地址)芜赌。
2仰挣、示例代碼
新增一個(gè)ClassA類,并添加一個(gè)NSString類型的name屬性缠沈,并添加copy關(guān)鍵字膘壶。另外,NSString類已經(jīng)遵守了NSCopying協(xié)議洲愤。
#import
@interfaceClassA:NSObject
@property(nonatomic,copy)NSString*name;
@end
在main.m文件中添加如下函數(shù)颓芭,并調(diào)用;
voidcopyTest(){
NSMutableString*string=[[NSMutableStringalloc]initWithFormat:@"www.hcios.com"];
ClassA*classA=[[ClassAalloc]init];
classA.name=string;
[stringappendString:@"+"];
NSLog(@"string : %@? address: %p",string,string);
NSLog(@"copy Property : %@? address: %p",classA.name,classA.name);
}
運(yùn)行結(jié)果如下柬赐,可以看到內(nèi)存地址不同亡问,并且指向不同的字符串。
接下來(lái)肛宋,修改屬性關(guān)鍵字為strong玛界,如下:
#import
@interfaceClassA:NSObject
@property(nonatomic,strong)NSString*name;
@end
再次運(yùn)行后万矾,運(yùn)行結(jié)果如下∩骺颍可以看到執(zhí)行復(fù)制操作的對(duì)象和原始對(duì)象指向同一個(gè)內(nèi)存地址,修改字符串的內(nèi)容后后添,復(fù)制對(duì)象和原始對(duì)象的值相同笨枯。