retain和copy的區別

2021-06-27 04:34:39 字數 634 閱讀 3268

當手動進行記憶體管理時,對於oc物件,在get方法中可以使用retain、 copy

對於普通oc物件使用retain

對於nsstring使用copy

retain :使當前物件的引用計數+1,在oc物件中使用

copy :建立乙個物件副本,和呼叫copy方法的物件不是同乙個,常常在nsstring中使用

深複製(mutablecopy):深拷貝為物件拷貝,原來的物件計數器不變。

淺複製:淺拷貝也為指標拷貝,拷貝後原來的物件計數器會+1;

(不可變物件的copy和retain一樣引用計數+1,mutablecopy為淺拷貝,可變物件的copy為淺copy,mutablecopy為深拷貝)

在拷貝時,按照copy或者mutablecopy的預設操作方式進行,只是在由不可變物件複製到不可變物件時,系統為了節約效能就沒有新建立這個不可變物件,其餘時候還是都要新開闢記憶體空間,將源物件指向的內容放到新開闢空間中,只是簡單的移動,不會進行多餘的操作。

個人感覺,理解深複製和淺複製的關鍵在於抓住複製的主要目的,即產生乙個副本物件,在改變源物件或者副本物件時,不會影響另外乙個,然後淺複製就是淺層次的複製,只複製表面的東西,深複製就是更深層次的複製,只要與之相關的全部複製過去。

retain和copy還有assign的區別

1.接觸過c,那麼假設你用malloc分配了一塊記憶體,並且把它的位址賦值給了指標a,後來你希望指標b也共享這塊記憶體,於是你又把a賦值給 assign 了b。此時a和b指向同一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定的,因為a並不知道b是否還在使用這塊記憶體,如果a釋放了,...

retain和copy還有assign的區別

1.假設你用malloc分配了一塊記憶體,並且把它的位址賦值給了指標a,後來你希望指標b也共享這塊記憶體,於是你又把a賦值給 assign 了b。此時a和b指向同一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定的,因為a並不知道b是否還在使用這塊記憶體,如果a釋放了,那麼b在使用這...

retain和copy還有assign的區別

1.假設你用malloc分配了一塊記憶體,並且把它的位址賦值給了指標a,後來你希望指標b也共享這塊記憶體,於是你又把a賦值給 assign 了b。此時a和b指向同一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定的,因為a並不知道b是否還在使用這塊記憶體,如果a釋放了,那麼b在使用這...