ios開發(fā)屬性copy 開發(fā)者選項內(nèi)容

理解iOS中深淺拷貝-為什么NSString使用copy

到這里全部真相大白了,說明我們的copy修飾的array進行了淺拷貝,我們知道只有當不可變對象使用copy時才是淺拷貝,那我們copy修飾的是一個可變數(shù)組,賦值的是一個不可變數(shù)組。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供伊吾企業(yè)網(wǎng)站建設,專注與做網(wǎng)站、成都做網(wǎng)站、HTML5建站、小程序制作等業(yè)務。10年已為伊吾眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。

分析:strstr2地址相同并且與str3地址不同,NSString的copy是淺拷貝,且copy返回的對象是不可變對象;mutableCopy是深拷貝。

通俗解釋:深拷貝是內(nèi)容拷貝,淺拷貝是地址拷貝 區(qū)別點:深拷貝會創(chuàng)建一個新的內(nèi)存空間,拷貝的值是一樣的,但是內(nèi)存地址不一樣。

原因:這里的copy是淺拷貝,并沒有生成新的對象 由上面的例子可以得出:但是,我們一般聲明NSString時,也不希望它改變,所以一般情況下,建議使用 copy ,這樣可以避免NSMutableString帶來的錯誤。

淺拷貝:修改堆內(nèi)存中的同一個值。深拷貝:修改堆內(nèi)存中的不同的值。

iOS定義屬性時,什么情況使用copy,assign和retain

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)默認屬性是assign。retain是指針的復制,copy是內(nèi)容的復制原子性修飾符:atomic nonatomicatomic:表示是線程安全的。nonatomic:表示是非線程安全的,使用此屬性性能會提高一些。

原來簡單解釋過屬性定義(Property),并且提起了簡單的retain,copy,assign的區(qū)別。那究竟是有什么區(qū)別呢?assign就不用說了,因為基本上是為簡單數(shù)據(jù)類型準備的,而不是NS對象們。

iOS深拷貝與淺拷貝(附demo)

學習資料 首先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é)果如下,實際對象是一致的。

ios開發(fā)之修飾符copy

在llvm層,其實對 copy 屬性做了編譯器優(yōu)化,之后才會調(diào)用 objc 中的 objc_setProperty_xxx 方法。

到這里全部真相大白了,說明我們的copy修飾的array進行了淺拷貝,我們知道只有當不可變對象使用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)存默認分配在棧上,而不是堆上的。

copy與strong類似。不同之處是strong的復制是多個指針指向同一個地址,而copy的復制每次會在內(nèi)存中拷貝一份對象,指針指向不同地址。copy一般用在修飾有可變對應類型的不可變對象上,如NSString, NSArray, NSDictionary。

可以看到我們修改strCoptTest,拷貝對象也被修改了。

iOS中assign,copy,retain之間的區(qū)別以及weak和strong的區(qū)別

copy與strong類似。不同之處是strong的復制是多個指針指向同一個地址,而copy的復制每次會在內(nèi)存中拷貝一份對象,指針指向不同地址。copy一般用在修飾有可變對應類型的不可變對象上,如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 用來修飾屬性。

網(wǎng)站欄目:ios開發(fā)屬性copy 開發(fā)者選項內(nèi)容
文章分享:http://muchs.cn/article23/dijohcs.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站導航網(wǎng)站設計公司、ChatGPT企業(yè)建站、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設