iOS源碼(二)copy的理解

屬性關(guān)鍵字:copy

copy的字面意思就是“復(fù)制”,它是產(chǎn)生一個(gè)副本的過程,再來看在iOS里,copy與mutableCopy都是NSObject里的方法,一個(gè)NSObject的對(duì)象要想使用這兩個(gè)函數(shù),那么類必須實(shí)現(xiàn)NSCopying協(xié)議或NSMutableCopying協(xié)議,并且是實(shí)現(xiàn)了一般來說我們用的很多系統(tǒng)里的容器類已經(jīng)實(shí)現(xiàn)了這些方法。

copy到底是深拷貝還是淺拷貝?

答:我相信有的同學(xué)認(rèn)為只要是使用copy關(guān)鍵字,那么肯定都是深拷貝,這樣是很不嚴(yán)謹(jǐn)?shù)?,就比如上個(gè)例子,雖然使用了copy,但是指針地址是一樣,那么它就應(yīng)該是淺拷貝。
所以是否是深淺拷貝,是否創(chuàng)建新的對(duì)象,是由程序運(yùn)行的環(huán)境所造成的,并不是一概而論。

深淺copy

淺copy:指針復(fù)制,不會(huì)創(chuàng)建一個(gè)新的對(duì)象。

深copy:內(nèi)容復(fù)制,會(huì)創(chuàng)建一個(gè)新的對(duì)象。

關(guān)于 NSString 與 NSMutableString 的例子

NSString *Str = [[NSString alloc]init];
NSString *Str2 = [Str copy];
NSLog(@"Str :  %p",Str);        //Str :  0x102e5b468  (Str對(duì)象地址)
NSLog(@"Str2 :  %p",Str2);      //Str2 :  0x102e5b468   (Str2對(duì)象地址)

可以看出,對(duì)于不可變對(duì)象的 NSString 使用copy是淺拷貝,因?yàn)閭z個(gè)對(duì)象地址相同,未開辟新的內(nèi)存空間。

NSMutableString *mStr = [[NSMutableString alloc]init];
NSMutableString *mStr2 = [mStr copy];
NSLog(@"mStr :  %p",mStr);      // mStr :  0x60000145d620   (mStr對(duì)象地址)
NSLog(@"mStr2 :  %p",mStr2);        // mStr2 :  0x103e3e7c8   (mStr2對(duì)象地址)

而對(duì)于NSMutableString可以看出,對(duì)于可變對(duì)象的 NSMutableString 使用copy是深拷貝,因?yàn)閭z個(gè)對(duì)象地址不同,開辟新的內(nèi)存空間。

蘋果為什么要這么設(shè)計(jì)?這么設(shè)計(jì)的優(yōu)點(diǎn)是什么?(為什么NSString使用copy是淺拷貝,而NSMutableString是深拷貝)

答:因?yàn)镹SString指的是一個(gè)不可變對(duì)象,所以如果使用copy的話也會(huì)復(fù)制一個(gè)不可變對(duì)象,但是這
時(shí)候其實(shí)復(fù)制的對(duì)象和原來的對(duì)象的內(nèi)存地址是一樣的,個(gè)人覺得這種設(shè)計(jì)方式是為了節(jié)省內(nèi)存空間,
因?yàn)镹SString指的是一個(gè)不可變對(duì)象,無論是copy前后的對(duì)象都是不可變的對(duì)象,所以新開鋪內(nèi)存空
間并沒有什么意義,這也可以解釋為什么 NSString  * str1=@"a"; NSString *str2 =
[str1 copy];  str1 = @“b”,b 的內(nèi)存地址會(huì)變得原因。
   而NSMutableString,使用copy會(huì)新開辟內(nèi)存空間的原因和上面想法,因?yàn)镹SMutableString
是一個(gè)可變對(duì)象,本身設(shè)計(jì)出來就是為了靈活變化用的。
?著作權(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)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,173評(píng)論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,618評(píng)論 1 32
  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.itdecent.cn/p/5f776a...
    Buddha_like閱讀 1,012評(píng)論 0 2
  • 回顧過去,展望未來 綿陽快服務(wù)經(jīng)過一年多的打磨:在冊(cè)騎士123人,其中眾包騎士占總騎士的99.9%,有很多同行曾建...
    綿陽快服務(wù)閱讀 650評(píng)論 2 2
  • 對(duì)于Java開發(fā)者來說,Java8的版本顯然是一個(gè)具有里程碑意義的版本,蘊(yùn)含了許多令人激動(dòng)的新特性,如果能利用好這...
    huanfuan閱讀 622評(píng)論 0 9

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