assign,copy,strong,weak 修飾屬性的區別

本人最近初學OC,研究了一下assign,copy,strong,retain,release四個屬性,之前也據說過,可是沒有細細的研究過,今天總結了一下,但願有不對的地方一塊兒討論,參考了這位大哥的文章安全

區別

他們的區別主要有兩點指針

  1. 是否有對內存的拷貝
  2. 是否有引用計數增長

內存地址的拷貝

copy 修飾對象時從新申請一分內存地址進行賦值
assign、strong和weak不會有對內存的拷貝對象

引用計數改變

assign和weak 修飾對象時 引用計數不變
strong 引用計數+1,防止原值被釋放
copy 從新申請一分內存地址,原引用計數不變,不互相影響生命週期

assign和weak 的區別

assign 和 weak 修飾屬性時不會產生引用計數+1的操做,他們的區別是
weak 修飾的屬性會在原屬性引用計數爲0時候自動置爲nil,因此weak修飾的屬性不能直接進行賦值操做(個人理解是由於weak修飾的屬性不會引用計數+1因此一賦值就馬上爲nil了),weak只能夠修飾對象。若是修飾基本數據類型,編譯器會報錯-「Property with ‘weak’ attribute must be of object type」。
assign修飾的屬性雖然也沒有產生引用計數+1的操做,可是當屬性引用地址爲0時,它只是進行值釋放,不會有對這個指針地址的數據抹除操做,容易形成野指針。因此assign最好只修飾值/基礎類型,不修飾指針類型的屬性(能夠修飾指針類型可是不安全),由於值類型的生命週期是由系統管理,存放在棧區,比較安全。內存

weak爲啥不能修飾值類型呢

這裏先留下一個點,後續有時間整理。get

相關文章
相關標籤/搜索