1.在ARC模式下,在有可能出現循環引用時,讓其一端使用weak修飾。例如:delegate(代理)屬性
2.自身已經對它強引用一次了,沒有必再強引用一次使用weak解決。例如:自定義IBOutlet控件屬性
- 兩者區別:
1.weak只能用于修飾對象類型,基本數據類型不能使用
2.assign修飾對象和基本數據類型都可以,但是只是簡單地進行賦值操作而已
注意:assign修飾的對象(一般編譯的時候會產生警告:Assigning retained object to unsafe property; object will be released after assignment)在釋放之后,指針的地址還是存在的,也就是說指針并沒有被置為nil,造成野指針。對象一般分配在堆上的某塊內存,如果在后續的內存分配中,剛好分到了這塊地址,程序就會崩潰掉。
那為什么可以用assign修飾基本數據類型?因為基礎數據類型一般分配在棧上,棧的內存會由系統自己自動處理,不會造成野指針。
weak修飾的對象在釋放之后,指針地址會被置為nil。所以現在一般弱引用就是用weak。