到這里全部真相大白了,說明我們的copy修飾的array進(jìn)行了淺拷貝,我們知道只有當(dāng)不可變對象使用copy時才是淺拷貝,那我們copy修飾的是一個可變數(shù)組,賦值的是一個不可變數(shù)組。
創(chuàng)新互聯(lián)公司是一家專業(yè)提供伊吾企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、成都做網(wǎng)站、HTML5建站、小程序制作等業(yè)務(wù)。10年已為伊吾眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
分析:strstr2地址相同并且與str3地址不同,NSString的copy是淺拷貝,且copy返回的對象是不可變對象;mutableCopy是深拷貝。
通俗解釋:深拷貝是內(nèi)容拷貝,淺拷貝是地址拷貝 區(qū)別點:深拷貝會創(chuàng)建一個新的內(nèi)存空間,拷貝的值是一樣的,但是內(nèi)存地址不一樣。
原因:這里的copy是淺拷貝,并沒有生成新的對象 由上面的例子可以得出:但是,我們一般聲明NSString時,也不希望它改變,所以一般情況下,建議使用 copy ,這樣可以避免NSMutableString帶來的錯誤。
淺拷貝:修改堆內(nèi)存中的同一個值。深拷貝:修改堆內(nèi)存中的不同的值。
copy: 用于希望保持一份傳入值的拷貝,而不是值自身的情況,即把原來的對象完整的賦值到另外一地方,重新加載一內(nèi)存區(qū),一個地方變了不影響另一個地方的對象。
NSString title;什么是assign,copy,retain之間的區(qū)別?assign:簡單賦值,不更改索引計數(shù)(Reference Counting)。
copy是創(chuàng)建一個新對象,retain是創(chuàng)建一個指針,引用對象計數(shù)加1。Copy屬性表示兩個對象內(nèi)容相同,新的對象retain為1 ,與舊有對象的引用計數(shù)無關(guān),舊有對象沒有變化。copy減少對象對上下文的依賴。
系統(tǒng)默認(rèn)屬性是assign。retain是指針的復(fù)制,copy是內(nèi)容的復(fù)制原子性修飾符:atomic nonatomicatomic:表示是線程安全的。nonatomic:表示是非線程安全的,使用此屬性性能會提高一些。
原來簡單解釋過屬性定義(Property),并且提起了簡單的retain,copy,assign的區(qū)別。那究竟是有什么區(qū)別呢?assign就不用說了,因為基本上是為簡單數(shù)據(jù)類型準(zhǔn)備的,而不是NS對象們。
學(xué)習(xí)資料 首先iOS拷貝可以區(qū)分為 深拷貝 和 淺拷貝 。 淺拷貝 :拷貝了對象的指針,可以理解為給一條狗加了一條繩子。 深拷貝 :直接拷貝對象到另外一塊內(nèi)存地址中,可以理解為新買了一條狗。
淺拷貝就是拷貝指向原來對象的指針,使原對象的引用計數(shù)+1,可以理解為創(chuàng)建了一個指向原對象的新指針而已,并沒有創(chuàng)建一個全新的對象。
用copy修飾的屬性,在setter時,會先調(diào)用傳入對象的copy方法得到一份拷貝后再retain,但不同的對象調(diào)用copy方法,可能是深拷貝也可能是淺拷貝,如果是淺拷貝,則兩個指針指向一個內(nèi)存,舊對象引用計數(shù)會加1。
深拷貝 :內(nèi)容拷貝,拷貝數(shù)據(jù)到一塊新內(nèi)存區(qū)域,指針指向拷貝的數(shù)據(jù)區(qū) strong: 淺拷貝,也就是指針引用,很明顯的。我們來測試一下 運行結(jié)果如下,實際對象是一致的。
在llvm層,其實對 copy 屬性做了編譯器優(yōu)化,之后才會調(diào)用 objc 中的 objc_setProperty_xxx 方法。
到這里全部真相大白了,說明我們的copy修飾的array進(jìn)行了淺拷貝,我們知道只有當(dāng)不可變對象使用copy時才是淺拷貝,那我們copy修飾的是一個可變數(shù)組,賦值的是一個不可變數(shù)組。
為了避免可變對象找不到方法crash,或者不可變對象被篡改,iOS中的不可變對象、容器一般都使用copy修飾符,保證setter方法中對傳入的新對象調(diào)用copy方法。
block 本質(zhì)上是一個OC對象,內(nèi)部有個 isa 指針,可以用 retain/strong/copy 等修飾詞修飾。但是 block 在創(chuàng)建的時候內(nèi)存默認(rèn)分配在棧上,而不是堆上的。
copy與strong類似。不同之處是strong的復(fù)制是多個指針指向同一個地址,而copy的復(fù)制每次會在內(nèi)存中拷貝一份對象,指針指向不同地址。copy一般用在修飾有可變對應(yīng)類型的不可變對象上,如NSString, NSArray, NSDictionary。
可以看到我們修改strCoptTest,拷貝對象也被修改了。
copy與strong類似。不同之處是strong的復(fù)制是多個指針指向同一個地址,而copy的復(fù)制每次會在內(nèi)存中拷貝一份對象,指針指向不同地址。copy一般用在修飾有可變對應(yīng)類型的不可變對象上,如NSString, NSArray, NSDictionary。
copy是創(chuàng)建一個新對象,retain是創(chuàng)建一個指針,引用對象計數(shù)加1。Copy屬性表示兩個對象內(nèi)容相同,新的對象retain為1 ,與舊有對象的引用計數(shù)無關(guān),舊有對象沒有變化。copy減少對象對上下文的依賴。
也就是說,retain 是指針拷貝,copy 是內(nèi)容拷貝。strong,weak 用來修飾屬性。