內存管理,readwrite,readonly,assign,retain,copy,nonatomic,的作用以及深淺拷貝

1.內存管理機制

當一個實例alloc以後,其引用計數器自動+1,在它引用到其他對象,或者超出作用域的時候,會自動減去1,此情況爲ARC的情況,若MRC,需要手動retain和release,或者創建自動釋放池來進行內存管理.

2.readwrite,readonly,assign,retain,copy,nonatomic的區別

readwrite:可讀可寫,默認屬性,系統會生成setter和getter方法

readonly:可讀,不可寫,系統指揮生成getter方法,只可讀取,不可賦值改動

assign:僅用在設置變量,是賦值特性,不進行retain操作,一般數據類型用它

retain: 計數器會+1,指針改變後,setter方法會relase對象然後retain新對象,新對象計數器+1,

copy:和retain類似,但是有區別,例如申明一個copy類型的對象A,初始A=B,實際上A產生了一個新的對象,計數器爲1,具體見下文copy和retain的區別

nonatomic:非原子性訪問,不加同步,多線程的時候可以提高性能,個人理解爲因爲非原子性,所以系統不用做額外的工作來保證線程安全,所以性能會高.如果是原子性, 所以不加nonatomic 線程則會相對安全.

3.copy和retain的區別

retain在IOS中常用,它只會進行引用計數器加1,後期操作對應release即可,arc則一般不用管計數器的操作,而copy則會創建一個新的對象的指針,會重新產生copy出來對象的引用計數器值.新的對象遵守協議後,在- (id)copyWithZone:(NSZone *)zone方法裏,所有屬性都相同.簡單來說,model2對象copy了model1對象以後,各自本身的引用計數器是分開的,但是各自的屬性卻是指向相同指針,公用着引用計數器.或許有人會問,那麼如果model1對象銷燬後,model2還在,那豈不是model1的屬性也還在?(model1都沒了,它的屬性還能在?你tm逗我呢?)

沒錯!確實就是還在,model2還用着!你model1確實是銷燬了,但是它的屬性銷燬不銷燬和它本身沒有任何關係,而是和它屬性的引用計數器有關係,說白了,因爲model2的存在,mode1的屬性的計數器在model1銷燬的時候,還是不爲0的.

從理論上講例如:moedel2是copy的model1得來,model1銷燬之前,你用一個變量接收過一次這個屬性(其實你也可以理解爲接受的是model2的這個屬性),那麼,在model1銷燬後,你會發現,這個變量是有內存的,說白了,就是model2在用着.

屬性爲copy的屬性,一般需要遵守協議並重寫- (id)copyWithZone:(NSZone *)zone

4.深淺複製的區別:潛複製只複製指向對象的指針,而不復制對象本身,深複製則引用對象本身,簡單來說,淺複製會根據對象的改變而改變,而深複製則完全重新分配了空間和指針,是兩個獨立的個體,只是剛開始的時候值相同

發佈了23 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章