一、區(qū)別
1.修飾變量類型的區(qū)別
weak 只可以修飾對象。如果修飾基本數(shù)據(jù)類型,編譯器會報錯-“Property with ‘weak’ attribute must be of object type”。
assign 可修飾對象,和基本數(shù)據(jù)類型。當(dāng)需要修飾對象類型時,MRC時代使用unsafe_unretained。當(dāng)然,unsafe_unretained也可能產(chǎn)生野指針,所以它名字是"unsafe_”。
2.是否產(chǎn)生野指針的區(qū)別
weak 不會產(chǎn)生野指針問題。因為weak修飾的對象釋放后(引用計數(shù)器值為0),指針會自動被置nil,之后再向該對象發(fā)消息也不會崩潰。 weak是安全的。
assign 如果修飾對象,會產(chǎn)生野指針問題;如果修飾基本數(shù)據(jù)類型則是安全的。修飾的對象釋放后,指針不會自動被置空,此時向?qū)ο蟀l(fā)消息會崩潰。
二、相似
都可以修飾對象類型,但是assign修飾對象會存在問題。
三、總結(jié)
assign 適用于基本數(shù)據(jù)類型如int,float,struct等值類型,不適用于引用類型。因為值類型會被放入棧中,遵循先進(jìn)后出原則,由系統(tǒng)負(fù)責(zé)管理棧內(nèi)存。而引用類型會被放入堆中,需要我們自己手動管理內(nèi)存或通過ARC管理。
weak 適用于delegate和block等引用類型,不會導(dǎo)致野指針問題,也不會循環(huán)引用,非常安全。