在iOS過程中,定義成員變量、屬性的時候,常常會用到retain strong copy assign weak等關鍵字,以下談一下個人的見解,如有錯漏,懇請大神斧正。
相信大家都有聽說過OC的ARC和MRC內存管理,retain和assign是MRC時代就有了,而在ARC提出後,strong就相當於retain,都是引用計數器+1,但是weak與assign就有點不一樣了,雖然都是弱引用,但是當屬性被釋放後,week會將屬性置nil,但是assign不會,這樣子就會成爲了野指針,是有風險的。copy不單隻引用計數器+1,對於可變對象還會做深拷貝的動作。
區別見下表:
關鍵字 | 引用計算器 | 區別說明 |
---|---|---|
retain | +1 | 強引用(MRC),拷貝指針,淺拷貝,引用計數器retainCount=0時,對象會被釋放 |
strong | +1 | 強引用(ARC),拷貝指針,淺拷貝,引用計數器retainCount=0時,對象會被釋放 |
copy | +1(屬性不可變)或不變(屬性可變) | 強引用 ,當屬性不可變時,拷貝指針,引用計數器+1;當屬性可變時,深拷貝,創建新的對象,引用計數器不變。 |
assign | 不變 | 弱引用(MRC),對象被銷燬時,不像強引用那樣因爲其它對於它的引用而受到影響,會立馬釋放,但是不會被置nil,指針會成爲野指針 |
weak | 不變 | 弱引用(ARC),對象被銷燬時,不像強引用那樣因爲其它對於它的引用而受到影響,會立馬釋放,會被置nil,指針不會成爲野指針,相對assign安全 |
*注:
名字 | 說明 |
---|---|
深拷貝(mutableCopy) | 指針和內容拷貝,新的對象,引用計數器不加1 |
淺拷貝(copy) | 指針拷貝,引用計數器加1 |