1、到這里全部真相大白了,說明我們的copy修飾的array進行了淺拷貝,我們知道只有當不可變對象使用copy時才是淺拷貝,那我們copy修飾的是一個可變數(shù)組,賦值的是一個不可變數(shù)組。
創(chuàng)新互聯(lián)憑借專業(yè)的設計團隊扎實的技術支持、優(yōu)質高效的服務意識和豐厚的資源優(yōu)勢,提供專業(yè)的網站策劃、成都做網站、網站制作、網站優(yōu)化、軟件開發(fā)、網站改版等服務,在成都十年的網站建設設計經驗,為成都數(shù)千家中小型企業(yè)策劃設計了網站。
2、為了避免可變對象找不到方法crash,或者不可變對象被篡改,iOS中的不可變對象、容器一般都使用copy修飾符,保證setter方法中對傳入的新對象調用copy方法。
3、內部有個 isa 指針,可以用 retain/strong/copy 等修飾詞修飾。但是 block 在創(chuàng)建的時候內存默認分配在棧上,而不是堆上的。所以它的作用域僅限創(chuàng)建時候的作用域內,當你在該作用域外調用該 block 時,程序就會崩潰。
4、copy與strong類似。不同之處是strong的復制是多個指針指向同一個地址,而copy的復制每次會在內存中拷貝一份對象,指針指向不同地址。copy一般用在修飾有可變對應類型的不可變對象上,如NSString, NSArray, NSDictionary。
5、Block的聲明和線程安全 Block屬性的聲明,首先需要用copy修飾符,因為只有copy后的Block才會在堆中,棧中的Block的生命周期是和棧綁定的,可以參考之前的文章(iOS: 非ARC下返回Block)。
6、可以看到我們修改strCoptTest,拷貝對象也被修改了。
到這里全部真相大白了,說明我們的copy修飾的array進行了淺拷貝,我們知道只有當不可變對象使用copy時才是淺拷貝,那我們copy修飾的是一個可變數(shù)組,賦值的是一個不可變數(shù)組。
淺拷貝就是對內存地址的復制,讓目標對象指針和源對象指向同一片內存空間,當內存銷毀的時候,指向這片內存的幾個指針需要重新定義才可以使用,要不然會成為野指針。
通俗解釋:深拷貝是內容拷貝,淺拷貝是地址拷貝 區(qū)別點:深拷貝會創(chuàng)建一個新的內存空間,拷貝的值是一樣的,但是內存地址不一樣。
如果想自定義一下copy 那么就必須遵守NSCopying,并且實現(xiàn) copyWithZone: 方法,如果想自定義一下mutableCopy 那么就必須遵守NSMutableCopying,并且實現(xiàn) mutableCopyWithZone: 方法。
方式一:initWithArray: copyItems: 下面先看如何使用 initWithArray: copyItems: 類型方法。使用該方法進行深復制時,第二個參數(shù)為 YES 。
如果對象是單層的(沒有嵌套的模型),此時,model遵循NSCopying,NSMutableCopying協(xié)議,實現(xiàn)copyWithZone和mutableCopyWithZone方法。
我們知道: 在對象創(chuàng)建的時候,無論是 alloc 還是 new,都會調用到 allocWithZone: 方法; 使用拷貝創(chuàng)建對象時,會調用 copyWithZone:,mutableCopyWithZone:方法; 那么,重寫這些方法,就可以讓創(chuàng)建的對象唯一。
注意,如果想要區(qū)分可變副本和不可變副本,那么copyWithZone:應該返回不可變副本,而mutableCopyWithZone:應該返回可變副本。
mutableCopyWithZone:.所以我們可以猜測一下, NSObject 的 mutableCopy 方法就是去調用 mutableCopyWithZone 并返回結果,如果該類沒有實現(xiàn) mutableCopyWithZone 方法,則拋出異常。
分享標題:ios開發(fā)nscopy iOs開發(fā) af取消下載
本文網址:http://aaarwkj.com/article8/disehop.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供自適應網站、響應式網站、搜索引擎優(yōu)化、定制網站、關鍵詞優(yōu)化、品牌網站設計
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)