淺 復(fù) 制:在復(fù)制操作時(shí)免姿,對(duì)于被復(fù)制的對(duì)象的每一層復(fù)制都是指針復(fù)制岖是。
深 復(fù) 制:在復(fù)制操作時(shí)行您,對(duì)于被復(fù)制的對(duì)象至少有一層復(fù)制是對(duì)象復(fù)制轴咱。
完全復(fù)制:在復(fù)制操作時(shí)汛蝙,對(duì)于被復(fù)制的對(duì)象的每一層復(fù)制都是對(duì)象復(fù)制烈涮。
淺層復(fù)制:復(fù)制引用對(duì)象的指針。
深層復(fù)制:復(fù)制引用對(duì)象內(nèi)容窖剑。
retain:始終是淺復(fù)制坚洽。引用計(jì)數(shù)每次加一。返回對(duì)象是否可變與被復(fù)制的對(duì)象保持一致西土。
copy:對(duì)于可變對(duì)象為深復(fù)制讶舰,引用計(jì)數(shù)不改變;對(duì)于不可變對(duì)象是淺復(fù)制, 引用計(jì)數(shù)每次加一需了。始終返回一個(gè)不可變對(duì)象跳昼。
mutableCopy:始終是深復(fù)制,引用計(jì)數(shù)不改變肋乍。始終返回一個(gè)可變對(duì)象庐舟。
不可變對(duì)象:值發(fā)生改變,其內(nèi)存首地址隨之改變住拭。
可變對(duì)象:無(wú)論值是否改變挪略,其內(nèi)存首地址都不隨之改變。
那么先讓我們來(lái)看一看下邊數(shù)組類型的轉(zhuǎn)換
1滔岳、不可變對(duì)象→可變對(duì)象的轉(zhuǎn)換:
NSArray *array1= [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];
NSMutableArray? *str2=[array1 mutableCopy];
2杠娱、可變對(duì)象→不可變對(duì)象的轉(zhuǎn)換:
NSMutableArray *array2? = [NSMutableArray arrayWithObjects:@"aa",@"bb",@"cc",@"dd",nil];
NSArray *array1=[? array2? ? Copy];
3、可變對(duì)象→可變對(duì)象的轉(zhuǎn)換(不同指針變量指向不同的內(nèi)存地址):
NSMutableArray *array1= [NSMutableArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];
NSMutableArray? *str2=[array1 mutableCopy];
通過(guò)上邊的兩個(gè)例子谱煤,我們可輕松的將一個(gè)對(duì)象在可變和不可變之間轉(zhuǎn)換摊求,并且這里不用考慮內(nèi)存使用原則(即引用計(jì)數(shù)的問(wèn)題)。沒(méi)錯(cuò)刘离,這就是深拷貝的魅力了。
4硫惕、同類型對(duì)象之間的指針復(fù)制(不同指針變量指向同一塊內(nèi)存地址):
a、
NSMutableString *str1=[NSMutableString stringWithString:@"two day"];
NSMutableString *str2=[str1? retain];
[str1? release];
b踪旷、
NSArray *array1= [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];
NSArray? *str2=[array1 Copy];
[array1 release];
什么時(shí)候用到深淺拷貝?
深拷貝是在要將一個(gè)對(duì)象從可變(不可變)轉(zhuǎn)為不可變(可變)或者將一個(gè)對(duì)象內(nèi)容克隆一份時(shí)用到豁辉;
淺拷貝是在要復(fù)制一個(gè)對(duì)象的指針時(shí)用到令野。