1. 程式人生 > >招聘靠譜程式設計師系列:2 什麼情況使用 weak 關鍵字,相比 assign 有什麼不同?

招聘靠譜程式設計師系列:2 什麼情況使用 weak 關鍵字,相比 assign 有什麼不同?

答:

1、什麼情況下使用weak:

a、在ARC中修飾代理
b、使用@IBOutlet連線控制元件
c、當block會造成迴圈引用

2、與assign的不同

assign可以用於非物件型別,而weak必須用於物件型別

參考資料:

1、區別
  • a、修飾變數型別的區別
    weak 只可以修飾物件。如果修飾基本資料型別,編譯器會報錯-“Property with ‘weak’ attribute must be of object type”。
    assign 可修飾物件,和基本資料型別。當需要修飾物件型別時,MRC時代使用unsafe_unretained。當然,unsafe_unretained也可能產生野指標,所以它名字是"unsafe_”。

  • b、是否產生野指標的區別
    weak 不會產生野指標問題。因為weak修飾的物件釋放後(引用計數器值為0),指標會自動被置nil,之後再向該物件發訊息也不會崩潰。 weak是安全的。
    assign 如果修飾物件,會產生野指標問題;如果修飾基本資料型別則是安全的。修飾的物件釋放後,指標不會自動被置空,此時向物件發訊息會崩潰。

2、相似

都可以修飾物件型別,但是assign修飾物件會存在問題。

3、總結
  • assign 適用於基本資料型別如int,float,struct等值型別,不適用於引用型別。因為值型別會被放入棧中,遵循先進後出原則,由系統負責管理棧記憶體。而引用型別會被放入堆中,需要我們自己手動管理記憶體或通過ARC管理。
  • weak 適用於delegate和block等引用型別,不會導致野指標問題,也不會迴圈引用,非常安全。