一蜗元、區(qū)別
1.修飾變量類型的區(qū)別
weak 只可以修飾對(duì)象或渤。如果修飾基本數(shù)據(jù)類型,編譯器會(huì)報(bào)錯(cuò)-“Property with ‘weak’ attribute must be of object type”奕扣。
assign 可修飾對(duì)象薪鹦,和基本數(shù)據(jù)類型。當(dāng)需要修飾對(duì)象類型時(shí)惯豆,MRC時(shí)代使用unsafe_unretained池磁。當(dāng)然,unsafe_unretained也可能產(chǎn)生野指針循帐,所以它名字是"unsafe_”框仔。
2.是否產(chǎn)生野指針的區(qū)別
weak 不會(huì)產(chǎn)生野指針問題舀武。因?yàn)閣eak修飾的對(duì)象釋放后(引用計(jì)數(shù)器值為0)拄养,指針會(huì)自動(dòng)被置nil,之后再向該對(duì)象發(fā)消息也不會(huì)崩潰银舱。 weak是安全的瘪匿。
assign 如果修飾對(duì)象,會(huì)產(chǎn)生野指針問題寻馏;如果修飾基本數(shù)據(jù)類型則是安全的棋弥。修飾的對(duì)象釋放后,指針不會(huì)自動(dòng)被置空诚欠,此時(shí)向?qū)ο蟀l(fā)消息會(huì)崩潰顽染。
二漾岳、相似
都可以修飾對(duì)象類型,但是assign修飾對(duì)象會(huì)存在問題粉寞。
三尼荆、總結(jié)
assign 適用于基本數(shù)據(jù)類型如int,float,struct等值類型,不適用于引用類型唧垦。因?yàn)橹殿愋蜁?huì)被放入棧中捅儒,遵循先進(jìn)后出原則,由系統(tǒng)負(fù)責(zé)管理?xiàng)?nèi)存振亮。而引用類型會(huì)被放入堆中巧还,需要我們自己手動(dòng)管理內(nèi)存或通過ARC管理。
weak 適用于delegate和block等引用類型坊秸,不會(huì)導(dǎo)致野指針問題麸祷,也不會(huì)循環(huán)引用,非常安全妇斤。