深拷貝细卧,淺拷貝概念
深拷貝就是把原來的數(shù)據(jù)拷貝出來存到一塊新的內(nèi)存中,并有一個(gè)新的指針指向新的內(nèi)存筒占,拷貝結(jié)束之后贪庙,兩個(gè)對象雖然存的值是相同的,但是內(nèi)存地址不一樣翰苫,兩個(gè)對象也互不影響止邮,互不干涉这橙。
淺拷貝就是拷貝數(shù)據(jù)所在內(nèi)存的地址,讓目標(biāo)對象指針和源對象指向同一片內(nèi)存空間导披;在 OC 里面屈扎, 使用retain 關(guān)鍵字進(jìn)行引用計(jì)數(shù),就是一種更加保險(xiǎn)的淺拷貝撩匕。他既讓幾個(gè)指針共用同一片內(nèi)存空間鹰晨,又可以在release 由于計(jì)數(shù)的存在,不會(huì)輕易的銷毀內(nèi)存止毕,達(dá)到更加簡單使用的目的模蜡。
OC里面copy與mutable copy與賦值分別是淺拷貝還是深拷貝?
直接寫個(gè)demo測試下:
@property (nonatomic, strong)NSMutableArray *suyaMArray;
@property (nonatomic, strong)NSArray *suyaIMArray;
self.suyaMArray = @[@1,@2,@3,@4,@6].mutableCopy;
NSMutableArray *suyaAssignmentMArray = self.suyaMArray;
NSMutableArray *suyaMArrayMutableCopy = self.suyaMArray.mutableCopy;
NSArray *suyaMArrayCopy = self.suyaMArray.copy;
NSLog(@"suyaMArray%p,%@",self.suyaMArray,self.suyaMArray);
[self.suyaMArray removeObject:@1];
NSLog(@"suyaMArray%p,%@",self.suyaMArray,self.suyaMArray);
NSLog(@"suyaAssignmentMArray%p,%@",suyaAssignmentMArray,suyaAssignmentMArray);
NSLog(@"suyaMArrayMutableCopy%p,%@",suyaMArrayMutableCopy,suyaMArrayMutableCopy);
NSLog(@"suyaMArrayCopy%p,%@",suyaMArrayCopy,suyaMArrayCopy);
self.suyaIMArray = @[@1,@2,@3,@4,@6].copy;
NSArray *suyaAssignmentIMArray = self.suyaIMArray;
NSArray *suyaIMArrayCopy = self.suyaIMArray.copy;
NSMutableArray *suyaIMArrayMutableCopy = self.suyaIMArray.mutableCopy;
NSLog(@"self.suyaIMArray%p,%@",self.suyaIMArray,self.suyaIMArray);
self.suyaIMArray = @[@2].copy;
NSLog(@"self.suyaIMArray%p,%@",self.suyaIMArray,self.suyaIMArray);
NSLog(@"suyaAssignmentIMArray%p,%@",suyaAssignmentIMArray,suyaAssignmentIMArray);
NSLog(@"suyaIMArrayCopy%p,%@",suyaIMArrayCopy,suyaIMArrayCopy);
NSLog(@"suyaIMArrayMutableCopy%p,%@",suyaIMArrayMutableCopy,suyaIMArrayMutableCopy);
打印結(jié)果:
suyaMArray0x6000002450a0,(
1,
2,
3,
4,
6
)
2017-09-11 17:17:52.089 TestDemo[14783:876388] suyaMArray0x6000002450a0,(
2,
3,
4,
6
)
2017-09-11 17:17:52.089 TestDemo[14783:876388] suyaAssignmentMArray0x6000002450a0,(
2,
3,
4,
6
)
2017-09-11 17:17:52.089 TestDemo[14783:876388] suyaMArrayMutableCopy0x6000002451c0,(
1,
2,
3,
4,
6
)
2017-09-11 17:17:52.090 TestDemo[14783:876388] suyaMArrayCopy0x6000000727c0,(
1,
2,
3,
4,
6
)
2017-09-11 17:17:52.090 TestDemo[14783:876388] self.suyaIMArray0x600000072340,(
1,
2,
3,
4,
6
)
2017-09-11 17:17:52.090 TestDemo[14783:876388] self.suyaIMArray0x600000019920,(
2
)
2017-09-11 17:17:52.090 TestDemo[14783:876388] suyaAssignmentIMArray0x600000072340,(
1,
2,
3,
4,
6
)
2017-09-11 17:17:52.090 TestDemo[14783:876388] suyaIMArrayCopy0x600000072340,(
1,
2,
3,
4,
6
)
2017-09-11 17:17:52.091 TestDemo[14783:876388] suyaIMArrayMutableCopy0x6000002451f0,(
1,
2,
3,
4,
6
)
先看關(guān)于可變對象NSMutableArray *suyaMArray這部分扁凛。直接賦值的suyaAssignmentMArray的指針與self.suyaMArray的指針相同且值隨著suyaMArray改變而改變忍疾,這是淺拷貝;mutablecopy的suyaMArrayMutableCopy的指針與self.suyaMArray的指針不同且值不隨著self.suyaMArray改變而改變谨朝,這是深拷貝卤妒;copy的suyaMArrayCopy與self.suyaMArray的指針不同且值不隨著self.suyaMArray改變而改變,這也是深拷貝叠必。
再看關(guān)于非可變對象NSArray *suyaIMArray這部分荚孵。直接賦值的suyaAssignmentIMArray的指針與self.suyaIMArray的改變前的指針相同,為淺拷貝纬朝;copy的suyaIMArrayCopy的指針與self.suyaIMArray的改變前的指針相同收叶,為淺拷貝;mutablecopy的suyaIMArrayMutableCopy的指針與self.suyaIMArray的改變前的指針不同共苛,為深拷貝判没。
總結(jié)如圖:
NSString、NSMutableString隅茎、NSDictionary澄峰、NSMutableDictionary一樣適用。表中的對象類型NSMutableArray可以改成可變對象辟犀,NSArray可以改為非可變對象俏竞。
思考:
如果修飾屬性都改為copy那么賦值之后的拷貝類型是什么呢?