關(guān)于Copy的深度解析

其實(shí)也不算深度解析啦凹炸,主要是題目要響亮一點(diǎn)大家才有看的欲望嘛!V绲堋啤它!

首先關(guān)于Copy想必在面試題中大家見(jiàn)過(guò)很多,下面我就寫(xiě)一下我對(duì)Copy的理解。

1.Copy是什么变骡?离赫??

copy和mutableCopy是方法塌碌,是NSObject內(nèi)定義的方法渊胸。

2.Copy有什么用?台妆?翎猛?

copy顧名思義就是拷貝或者說(shuō)克隆,所以copy的目的就是復(fù)制一份原來(lái)的內(nèi)容接剩,進(jìn)一步思考為什么需要拷貝切厘?顯然:拷貝的目的就是改變?cè)瓉?lái)的內(nèi)容不影響副本,改變副本也不影響原來(lái)的內(nèi)容懊缺。

3.從NSString,NSMutableString,NSArray,NSMutableArray說(shuō)明深拷貝和淺拷貝的區(qū)別

首先大家來(lái)想一下為什么要用到Copy疫稿??Copy的目的所在是什么鹃两?為什么需要生成一個(gè)新的對(duì)象呢遗座??俊扳?

Copy是為了互不干擾途蒋,生成兩個(gè)對(duì)象是為了相互改變的時(shí)候不影響另外一個(gè)對(duì)象。

其次大家要牢記一點(diǎn)馋记,使用Copy方法得到的是不可變對(duì)象碎绎,使用mutableCopy方法得到的必須是可變對(duì)象

一.NSString抗果、NSMutableString非容器對(duì)象分析

1.不可變字符串的copy和mutableCopy

NSString *str = @"xiaoming";

NSString *str1 = [str copy];

NSMutableString * str2 = [str mutableCopy];

NSLog(@"----str:%p,%@,%@----str1:%p,%@,%@----str2:%p,%@,%@",str,str,NSStringFromClass([str class]),str1,str1,NSStringFromClass([str1 class]),str2,str2,NSStringFromClass([str2 class]));

打印結(jié)果如下:

----str:0x10c8e4068,xiaoming,__NSCFConstantString----str1:0x10c8e4068,xiaoming,__NSCFConstantString----str2:0x608000266ac0,xiaoming,__NSCFString

通過(guò)上面的打印結(jié)果大家可以看到不可變的字符串經(jīng)過(guò)copy之后沒(méi)有生成對(duì)象筋帖,得到的是不可變字符串,經(jīng)過(guò)mutableCopy之后生成了新的對(duì)象冤馏,得到是可變字符串日麸。

為什么copy沒(méi)有得到對(duì)象呢?逮光?代箭?因?yàn)樵瓉?lái)的對(duì)象是不可以修改的,新拷貝的對(duì)象也是不可修改的涕刚,所以不會(huì)影響到另外一個(gè)對(duì)象嗡综。已經(jīng)符合拷貝的目的 了,所以杜漠,OC為了對(duì)內(nèi)存進(jìn)行優(yōu)化, 就不會(huì)生成一個(gè)新的對(duì)象极景。

為什么mutableCopy會(huì)生成新的對(duì)象呢察净?生成的是一個(gè)可變對(duì)象,這樣兩個(gè)對(duì)象其中一個(gè)對(duì)象改變而不影響另外一個(gè)對(duì)象盼樟。

2.可變字符串的copy和mutableCopy

NSMutableString *mulStr = [NSMutableString stringWithFormat:@"abc"];

NSString *mulStr1 = [mulStr copy];

NSMutableString * mulStr2 = [mulStr mutableCopy];

NSLog(@"----str:%p,%@,%@----str1:%p,%@,%@----str2:%p,%@,%@",mulStr,mulStr,NSStringFromClass([mulStr class]),mulStr1,mulStr1,NSStringFromClass([mulStr1 class]),mulStr2,mulStr2,NSStringFromClass([mulStr2 class]));

打印結(jié)果如下:

----str:0x600000260180,abc,__NSCFString----str1:0xa000000006362613,abc,NSTaggedPointerString----str2:0x6000002601c0,abc,__NSCFString

通過(guò)上面的打印結(jié)果可以看出來(lái)可變字符串經(jīng)過(guò)copy和mutableCopy之后都創(chuàng)建了新的對(duì)象氢卡。經(jīng)過(guò)copy之后得到的是不可變字符串,經(jīng)過(guò)mutableCopy之后 得到的是可變字符串晨缴。

為什么都會(huì)生成對(duì)象呢译秦??击碗?因?yàn)榭勺冏址緛?lái)就是可以改變的筑悴,為了改變互不干擾,從而生成新的對(duì)象稍途,符合拷貝的目的雷猪。

二:NSArray、NSMutableArray容器對(duì)象分析

首先容器對(duì)象和非容器對(duì)象一樣同樣遵從下面的總結(jié):

如果對(duì)一不可變對(duì)象復(fù)制晰房,copy是指針復(fù)制(淺拷貝)、mutableCopy就是對(duì)象復(fù)制(深拷貝)射沟。

如果是對(duì)可變對(duì)象復(fù)制殊者,都是深拷貝,但是copy返回的對(duì)象是不可變的验夯。

1.NSArray的copy和mutableCopy?

NSArray *array = [[NSArray alloc]initWithObjects:[NSMutableString stringWithFormat:@"a"],@"b",@"c", nil];

NSArray *array1 = [array copy];

NSMutableArray *array2 = [array mutableCopy];

// NSArray *array3 = [array mutableCopy];

NSArray *array3 = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:array]];

NSLog(@"----array:%p,----array1:%p,-----array2:%p,----array3:%p",array,array1,array2,array3);

NSMutableString *str1 = [array objectAtIndex:0];

[str1 appendString:@"hahhaha"];

[array2 insertObject:@"111111" atIndex:0];

NSMutableString *str2 = [array2 objectAtIndex:1];

[str2 appendString:@"111111"];

NSLog(@"----array:%@,----array1:%@,-----array2:%@,----array3:%@",array,array1,array2,array3);

打印結(jié)果如下:

?----array:0x608000242070,----array1:0x608000242070,-----array2:0x608000242b50,----array3:0x608000242d90

?----array:(

ahahhaha111111,

b,

c

),----array1:(

ahahhaha111111,

b,

c

),-----array2:(

111111,

ahahhaha111111,

b,

c

),----array3:(

a,

b,

c

)

通過(guò)上面的打印可以看出來(lái)NSArray 經(jīng)過(guò)Copy之后沒(méi)有創(chuàng)建對(duì)象猖吴,經(jīng)過(guò)mutableCopy之后創(chuàng)建了新的對(duì)象,具體原因和NSString一樣挥转,但是里面的元素對(duì)象還是指針拷貝海蔽,要想做到對(duì)象拷貝,可以使用歸檔的方法绑谣。

2.NSMutableArray 的copy和MutableCopy

NSMutableArray *mulArray = [[NSMutableArray alloc]initWithObjects:[NSMutableString stringWithFormat:@"abc"],@"def", nil];

NSMutableArray *mulArray1 = [mulArray copy];

NSMutableArray *mulArray2 = [mulArray mutableCopy];

NSLog(@"----array:%p,----arrar1:%p,----array2:%p",mulArray,mulArray1,mulArray2);

NSMutableString *mulstr = [mulArray objectAtIndex:0];

[mulstr appendString:@"abc"];

NSLog(@"----array:%@,-----array1:%@,-----array2:%@",mulArray,mulArray1,mulArray2);

NSLog(@"----array:%@,-----array1:%@,-----array2:%@",NSStringFromClass([mulArray class]) ,NSStringFromClass([mulArray1 class]),NSStringFromClass([mulArray2 class]));

打印結(jié)果如下:

----array:0x60000005af40,----arrar1:0x60000002b1a0,----array2:0x60000005ad60

----array:(

abcabc,

def

),-----array1:(

abcabc,

def

),-----array2:(

abcabc,

def

)

通過(guò)上面的打印可以看出來(lái)NSArray 經(jīng)過(guò)Copy和mutableCopy之后都創(chuàng)建新的對(duì)象党窜,具體原因和NSString一樣,但是里面的元素對(duì)象還是指針拷貝借宵,要想做到對(duì)象拷貝幌衣,可以使用歸檔的方法。

但是大家還要牢記一點(diǎn):NSMutableArray多次copy每次都會(huì)新建對(duì)象而NSArray多次copy只新建一次對(duì)象壤玫。

4.總結(jié)

正是因?yàn)檎{(diào)用copy方法有時(shí)候會(huì)生成一個(gè)新的對(duì)象, 有時(shí)候不會(huì)生成一個(gè)新的對(duì)象所以:

如果沒(méi)有生成新的對(duì)象, 我們稱之為淺拷貝, 本質(zhì)就是指針拷貝

如果生成了新的對(duì)象, 我們稱之為深拷貝, 本質(zhì)就是會(huì)創(chuàng)建一個(gè)新的對(duì)象

最后:最重要的還是記住拷貝的目的豁护,這樣理解深淺拷貝都會(huì)變得非常簡(jiǎn)單,改變?cè)瓉?lái)的內(nèi)容不影響副本欲间,改變副本也不影響原來(lái)的內(nèi)容

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末楚里,一起剝皮案震驚了整個(gè)濱河市报破,隨后出現(xiàn)的幾起案子敌卓,更是在濱河造成了極大的恐慌,老刑警劉巖揣非,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吝梅,居然都是意外死亡虱疏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)苏携,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)做瞪,“玉大人,你說(shuō)我怎么就攤上這事右冻∽芭睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵纱扭,是天一觀的道長(zhǎng)牍帚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)乳蛾,這世上最難降的妖魔是什么暗赶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮肃叶,結(jié)果婚禮上蹂随,老公的妹妹穿的比我還像新娘。我一直安慰自己因惭,他們只是感情好岳锁,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蹦魔,像睡著了一般激率。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勿决,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天乒躺,我揣著相機(jī)與錄音,去河邊找鬼低缩。 笑死聪蘸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的表制。 我是一名探鬼主播健爬,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼么介!你這毒婦竟也來(lái)了娜遵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤壤短,失蹤者是張志新(化名)和其女友劉穎设拟,沒(méi)想到半個(gè)月后慨仿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纳胧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年镰吆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跑慕。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡万皿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出核行,到底是詐尸還是另有隱情牢硅,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布芝雪,位于F島的核電站减余,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惩系。R本人自食惡果不足惜位岔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堡牡。 院中可真熱鬧抒抬,春花似錦、人聲如沸悴侵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)可免。三九已至,卻和暖如春做粤,著一層夾襖步出監(jiān)牢的瞬間浇借,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工怕品, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妇垢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓肉康,卻偏偏與公主長(zhǎng)得像闯估,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吼和,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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