weak和assign的區別-正確使用weak、assign 一、區別 1.修飾變數類型的區別weak只可以修飾對象。如果修飾基本數據類型,編譯器會報錯-“Property with ‘weak’ attribute must be of object type”。assign可修飾對象,和基本數據 ...
weak和assign的區別-正確使用weak、assign
一、區別
1.修飾變數類型的區別
weak只可以修飾對象。如果修飾基本數據類型,編譯器會報錯-“Property with ‘weak’ attribute must be of object type”。
assign可修飾對象,和基本數據類型。當需要修飾對象類型時,MRC時代使用unsafe_unretained。當然,unsafe_unretained也可能產生野指針,所以它名字是"unsafe_”。
2.是否產生野指針的區別
weak不會產生野指針問題。因為weak修飾的對象釋放後(引用計數器值為0),指針會自動被置nil,之後再向該對象發消息也不會崩潰。 weak是安全的。
assign如果修飾對象,會產生野指針問題;如果修飾基本數據類型則是安全的。修飾的對象釋放後,指針不會自動被置空,此時向對象發消息會崩潰。
二、相似
都可以修飾對象類型,但是assign修飾對象會存在問題。
三、總結
assign適用於基本數據類型如int,float,struct等值類型,不適用於引用類型。因為值類型會被放入棧中,遵循先進後出原則,由系統負責管理棧記憶體。而引用類型會被放入堆中,需要我們自己手動管理記憶體或通過ARC管理。
weak適用於delegate和block等引用類型,不會導致野指針問題,也不會迴圈引用,非常安全。