copy與retain 深拷貝與淺拷貝

2022-09-11 15:27:23 字數 1887 閱讀 5746

copy與retain的區別:

1.copy是建立乙個新物件,retain是建立乙個指標,引用物件計數加1.copy屬性表示兩個物件內容相同,新的物件retain為1,與舊有物件的引用計數無關,舊有物件沒有變化copy減少物件上下文的依賴.

2.retain屬性表示兩個物件位址相同(建立乙個指標,指標拷貝),內容當然是相同,這個物件的retain值加1,也就是說,retain是指標拷貝,copy是內容拷貝.

字串為什麼使用copy?

1.概念:

假如有乙個nsmutablestring,現在用他給乙個retain修飾的nsstring賦值,那麼只是將nsstring指向了乙個nsmutablestring所指向的位置,並對nsmutablestring奇數器加1,此時,

此時,如果對nsmutablestring進行修改,也會導致nsstring的值修改,原則上這是不允許的.

如果是copy修飾的nsstring物件,在用nsmutablestring給他賦值時,會進行深拷貝,及把內容也給拷貝了乙份,兩者指向不同位置,即使改變了nsmutablestring的值,

nsstring的值也不會改變.所以用copy是為了安全,防止nsmutablestring賦值給nsstring時,前者修改引起後者值變化而用的.

2 提示 : 謹記copy屬性的setter方法的結構.

3 :簡述,當給乙個物件賦新值時,會把新值拷貝乙個副本出來賦值給物件,這樣新值跟舊值就沒有任何關係.

淺拷貝和深拷貝

深拷貝:內容拷貝,源物件和副本物件指的是兩個不同的物件,源物件引用計數器不變,副本引用計數器為1.

淺拷貝:指標拷貝,源物件和副本物件指的是同乙個物件,物件引用計數器加1,相當於retain.

提示:只有不可變的物件建立不可變副本(copy)才是淺拷貝,其它都是深拷貝.

如果對不可變物件拷貝,copy是指標拷貝(淺拷貝);但是,mutablecopy就是物件拷貝(深拷貝).

如果是對可變物件拷貝,copy都是深拷貝,但是,copy返回的物件是不可變的.

自定義物件的拷貝

自定義物件如果要淺拷貝就遵守協議  (copy)

自定義物件如果要深拷貝就遵守協議  (mutablecopy)

自定義物件遵守了相關協議,就能夠呼叫相應的深拷貝或者淺拷貝的方法

當然在ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守nsmutablecopying 協議的類才可以傳送mutablecopy訊息。假如傳送了乙個沒有遵守上訴兩協議而傳送 copy或者 mutablecopy,那麼就會發生異常。但是預設的ios類並沒有遵守這兩個協議。如果想自定義一下copy 那麼就必須遵守nscopying,並且實現 copywithzone: 方法,如果想自定義一下mutablecopy 那麼就必須遵守nsmutablecopying,並且實現 mutablecopywithzone: 方法。

block定義成屬性為什麼用copy?

mrc:block的本質是函式指標,記憶體位址在棧區,使用copy是為了把block由棧區拷貝到堆區,共享給當前物件使用.

arc:block定義屬性是,使用strong和copy效果一樣,但是蘋果官方建議使用copy.

容器的記憶體管理

[tmpm addobject:obj];

這樣obj的引用計數會增加1.tmpm對obj強引用.

[tmpm removeobjectatindex:0];

obj的引用計數會減1.tmpm不再對obj有引用.

Python 淺拷貝與深拷貝,copy模組

python中的任何變數都是物件 引用型別 python中的變數分為可變型別和不可變型別。淺拷貝和深拷貝都是拷貝可變型別內容,不可變型別不會拷貝 注意 因為元組是不可變型別,所以元組的淺拷貝並不會拷貝任何內容,而是直接引用源元組 和 賦值等同 如果元組中的元素都是不可變型別,那麼元組的深拷貝也並不會...

拷貝建構函式 深cop與淺copy

在乙個類物件的定義過程中,物件初始化分為兩種 1 直接初始化,要求編譯器使用普通的函式匹配,選擇我們提供的最匹配的建構函式,2 拷貝初始化,要求編譯器將右側運算物件拷貝到正在建立的物件中,通常使用拷貝建構函式來完成。直接初始化,使用string的建構函式string size t n,char c ...

字串中的retain與copy

nsmutablestring mstr nsmutablestring string mstr setstring 我沒變 self.retainstr mstr self.cpstr mstr self.retainmstr mstr self.cpmstr mstr nslog retains...