iOS 深度理解淺拷貝與深拷貝

在工作中如果不能正確理解淺拷貝與深拷貝就會(huì)造成不想改變的值被改變了,出現(xiàn)了再次使用數(shù)組時(shí)沒有數(shù)據(jù),顯示的值不是我們想要的等一些問題。只有真正理解了淺拷貝與深拷貝才能使我們?cè)陂_發(fā)中事半功倍,廢話少說,代碼走起~~~

定義理解

淺拷貝:拷貝后只是指向了該對(duì)象的地址,這兩個(gè)對(duì)象指向了同一個(gè)內(nèi)存地址,通過任何一個(gè)對(duì)象修改值,這兩個(gè)對(duì)象再次獲取值都是獲取修改后的值。
深拷貝:拷貝了對(duì)象的內(nèi)容然后重新開辟了新的內(nèi)存空間,這是兩個(gè)互相獨(dú)立的對(duì)象,對(duì)任意一個(gè)修改值,另一個(gè)的值都不會(huì)改變。

字符串的深拷貝與淺拷貝

不可變字符串

NSString *test = @"copy456";
NSString *test1 = [test copy]; //淺拷貝
NSString *test2 = [test mutableCopy]; //深拷貝

打印結(jié)果:

 test:0x101683068
 test1:0x101683068
 test2:0x604000049330

從打印結(jié)果我們可以看到使用copy賦值給一個(gè)不可變對(duì)象時(shí)是淺拷貝,指向了同一個(gè)內(nèi)存地址。使用mutableCopy賦值給一個(gè)不可變對(duì)象是深拷貝,重新分配了內(nèi)存空間。

可變字符串

NSMutableString *mtest = [[NSMutableString alloc] initWithString:@"mutableCopy NSSting"];
NSMutableString *mtest4 = [mtest copy]; // 深拷貝
NSMutableString *mtest5 = [mtest mutableCopy]; //深拷貝

打印結(jié)果:

 mtest:0x600000445ac0
 mtest4:0x600000445c10
 mtest5:0x600000445a90

通過copy或mutableCopy的方式賦值給可變對(duì)象,從打印的結(jié)果可以看到它們?nèi)齻€(gè)指向的內(nèi)存地址都是不一樣的,因此都是深拷貝。

集合類對(duì)象的深拷貝與淺拷貝

對(duì)于集合類對(duì)象我們以數(shù)組為例進(jìn)行說明

不可變對(duì)象

NSArray *testArray = @[@"A", @"B", @"C"];
NSArray *testArray1 = [testArray copy]; //淺拷貝
NSArray *testArray2 = [testArray mutableCopy]; //深拷貝

打印結(jié)果:

testArray:0x60400004a4d0
testArray1:0x60400004a4d0
testArray2:0x60400004a770

通過copy賦值testArray1與testArray指向相同的內(nèi)存地址,因此通過copy的方式賦值給不可變對(duì)象是淺拷貝。testArray2是新的內(nèi)存地址,通過mutableCopy的方式賦值給一個(gè)不可變對(duì)象是深拷貝。

可變對(duì)象

NSMutableArray *mTestArray = [[NSMutableArray alloc] init];
NSMutableArray *mTestArray1 = [mTestArray copy]; //深拷貝
NSMutableArray *mTestArray2 = [mTestArray mutableCopy]; //淺拷貝

打印結(jié)果:

testArray:0x60800005ba50
testArray1:0x60c000004910
testArray2:0x60800005bc00

無論是copy還是mutableCopy賦值給一個(gè)可變對(duì)象時(shí)都是深拷貝。

集合對(duì)象的值

打印數(shù)組的第一個(gè)值的內(nèi)存地址

NSLog(@"testArray 1value:%p", [mTestArray objectAtIndex:0]);
NSLog(@"testArray1 1value:%p", [mTestArray1 objectAtIndex:0]);
NSLog(@"testArray2 1value:%p", [mTestArray2 objectAtIndex:0]);

打印結(jié)果:

 testArray 1value:0x104b67238
 testArray1 1value:0x104b67238
 testArray2 1value:0x104b67238

我們看到打印的結(jié)果第一個(gè)值都指向了同一個(gè)內(nèi)存地址,這說明集合對(duì)象的深拷貝只是單層深拷貝,只是給該對(duì)象分配了一個(gè)新的內(nèi)存地址而集合對(duì)象里面的值還都指向原來的內(nèi)存地址。

property中使用copy屬性

@interface ViewController ()

@property (nonatomic, copy) NSString *pTest;
@property (nonatomic, copy) NSMutableString *mpTest;

@end

self.pTest = test;
NSLog(@"test:%p", test);
NSLog(@"pTest:%p", _pTest);

self.mpTest = mtest;
NSLog(@"mtest:%p", mtest);
NSLog(@"mpTest:%p", _mpTest);

打印結(jié)果:

test:0x10b07e088
pTest:0x10b07e088
mtest:0x6040002410e0
mpTest:0x604000241770

通過打印結(jié)果我們可以看到不可變對(duì)象是淺拷貝,可變度對(duì)象是深拷貝。其實(shí)看到set方法的實(shí)現(xiàn)原來我們就明白了property里的copy什么時(shí)候是深拷貝,什么時(shí)候是淺拷貝

- (void)setPTest:(NSString *)pTest {
    _pTest = [pTest copy];
}

GitHub地址:https://github.com/jiamingzhou/Copy.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,400評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,452評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,818評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,997評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,552評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,292評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,510評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,721評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評(píng)論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,235評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,480評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容

  • 1、對(duì)象拷貝有兩種方式:淺復(fù)制和深復(fù)制。顧名思義,淺復(fù)制,并不拷貝對(duì)象本身,僅僅是拷貝指向?qū)ο蟮闹羔槪簧顝?fù)制是直接...
    滴答大閱讀 781評(píng)論 0 2
  • 深拷貝和淺拷貝這個(gè)問題在面試中常常被問到,而在實(shí)際開發(fā)中,只要稍有不慎,就會(huì)在這里出現(xiàn)問題。尤其對(duì)于初學(xué)者來說,我...
    西門淋雨閱讀 1,807評(píng)論 0 1
  • 導(dǎo)讀 最近經(jīng)常在關(guān)注的公眾號(hào)或者技術(shù)網(wǎng)站看到關(guān)于 iOS 深拷貝與淺拷貝的話題。看到一篇技術(shù)文章,點(diǎn)擊收藏或者只是...
    獨(dú)木舟的木閱讀 680評(píng)論 0 8
  • 這篇文章主要翻譯apple的官方文檔和其他類似博文的學(xué)習(xí)記錄 Copying Collections 概念 拷貝的...
    devZhang閱讀 3,046評(píng)論 3 23
  • 久臥孤城不自哀, 深居簡(jiǎn)出心懈怠。 寄情山水思良久, 諸事纏身未如愿。 恰逢端午有余閑, 呼朋結(jié)為五人伴。 出滬入...
    清風(fēng)明月slowly閱讀 235評(píng)論 0 1