OC中的深拷貝,淺拷貝,賦值

深拷貝,淺拷貝概念

深拷貝就是把原來(lái)的數(shù)據(jù)拷貝出來(lái)存到一塊新的內(nèi)存中,并有一個(gè)新的指針指向新的內(nèi)存,拷貝結(jié)束之后,兩個(gè)對(duì)象雖然存的值是相同的,但是內(nèi)存地址不一樣,兩個(gè)對(duì)象也互不影響,互不干涉。

淺拷貝就是拷貝數(shù)據(jù)所在內(nèi)存的地址,讓目標(biāo)對(duì)象指針和源對(duì)象指向同一片內(nèi)存空間;在 OC 里面, 使用retain 關(guān)鍵字進(jìn)行引用計(jì)數(shù),就是一種更加保險(xiǎn)的淺拷貝。他既讓幾個(gè)指針共用同一片內(nèi)存空間,又可以在release 由于計(jì)數(shù)的存在,不會(huì)輕易的銷毀內(nèi)存,達(dá)到更加簡(jiǎn)單使用的目的。

OC里面copy與mutable copy與賦值分別是淺拷貝還是深拷貝?

直接寫個(gè)demo測(cè)試下:

@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)于可變對(duì)象NSMutableArray *suyaMArray這部分。直接賦值的suyaAssignmentMArray的指針與self.suyaMArray的指針相同且值隨著suyaMArray改變而改變,這是淺拷貝;mutablecopy的suyaMArrayMutableCopy的指針與self.suyaMArray的指針不同且值不隨著self.suyaMArray改變而改變,這是深拷貝;copy的suyaMArrayCopy與self.suyaMArray的指針不同且值不隨著self.suyaMArray改變而改變,這也是深拷貝。

再看關(guān)于非可變對(duì)象NSArray *suyaIMArray這部分。直接賦值的suyaAssignmentIMArray的指針與self.suyaIMArray的改變前的指針相同,為淺拷貝;copy的suyaIMArrayCopy的指針與self.suyaIMArray的改變前的指針相同,為淺拷貝;mutablecopy的suyaIMArrayMutableCopy的指針與self.suyaIMArray的改變前的指針不同,為深拷貝。

總結(jié)如圖:


深拷貝淺拷貝

NSString、NSMutableString、NSDictionary、NSMutableDictionary一樣適用。表中的對(duì)象類型NSMutableArray可以改成可變對(duì)象,NSArray可以改為非可變對(duì)象。

思考:

如果修飾屬性都改為copy那么賦值之后的拷貝類型是什么呢?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.itdecent.cn/p/5f776a...
    Buddha_like閱讀 1,021評(píng)論 0 2
  • 深拷貝和淺拷貝這個(gè)問題在面試中常常被問到,而在實(shí)際開發(fā)中,只要稍有不慎,就會(huì)在這里出現(xiàn)問題。尤其對(duì)于初學(xué)者來(lái)說(shuō),我...
    西門淋雨閱讀 1,926評(píng)論 0 1
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,594評(píng)論 0 6
  • 昨日立秋, 你穿上華麗的秋裝,回饋龍城兒女一份大禮; 昨日立秋, 用你的恩賜,洗凈了酷熱一夏的城市,澆滅了席卷大地...
    大漠孤月閱讀 453評(píng)論 0 0
  • 高考結(jié)束已經(jīng)好些天了,想到去年的這個(gè)時(shí)候,自己已經(jīng)開啟了自由模式,吃吃喝喝,過上神仙般的假期??墒?,在分?jǐn)?shù)下來(lái)之前...
    Ms念文閱讀 1,258評(píng)論 8 5

友情鏈接更多精彩內(nèi)容