本人最近初學OC,研究了一下assign,copy,strong,retain,release四個屬性,之前也據說過,可是沒有細細的研究過,今天總結了一下,但願有不對的地方一塊兒討論,參考了這位大哥的文章安全
他們的區別主要有兩點指針
copy 修飾對象時從新申請一分內存地址進行賦值
assign、strong和weak不會有對內存的拷貝對象
assign和weak 修飾對象時 引用計數不變
strong 引用計數+1,防止原值被釋放
copy 從新申請一分內存地址,原引用計數不變,不互相影響生命週期
assign 和 weak 修飾屬性時不會產生引用計數+1的操做,他們的區別是
weak 修飾的屬性會在原屬性引用計數爲0時候自動置爲nil,因此weak修飾的屬性不能直接進行賦值操做(個人理解是由於weak修飾的屬性不會引用計數+1因此一賦值就馬上爲nil了),weak只能夠修飾對象。若是修飾基本數據類型,編譯器會報錯-「Property with ‘weak’ attribute must be of object type」。
assign修飾的屬性雖然也沒有產生引用計數+1的操做,可是當屬性引用地址爲0時,它只是進行值釋放,不會有對這個指針地址的數據抹除操做,容易形成野指針。因此assign最好只修飾值/基礎類型,不修飾指針類型的屬性(能夠修飾指針類型可是不安全),由於值類型的生命週期是由系統管理,存放在棧區,比較安全。內存
這裏先留下一個點,後續有時間整理。get