原文地址:https://vsccw.com/2017/04/04/assign-crash-oc-object/
前幾天公司的項目中遇到了一個奇怪的問題皿伺,大致就是在Release
版本下測試神得,程序總會閃退频轿,Debug
環(huán)境正常。最后發(fā)現(xiàn)是一個同事手誤用assign
修飾了OC對象所導致的痊银。
但是這引起我的一些思考抵蚊,以前只是知道assign
用于修飾基本數(shù)據(jù)類型,但是
為什么assign
一般用于修飾基本數(shù)據(jù)類型溯革?assign
其實也可以用來修飾對象, 那么我們?yōu)槭裁床挥盟揎棇ο竽兀?/h3>
-
assign
是指針賦值贞绳,被assign
修飾的對象, 在釋放之后,指針的地址還是存在的鬓照,也就是說指針并沒有被置為nil
熔酷,造成野指針孤紧。而且對象一般分配在堆上的某塊內(nèi)存豺裆,如果在后續(xù)的內(nèi)存分配中,剛好分到了這塊地址号显,程序就會崩潰掉臭猜。
-
assign
僅僅完成一個變量賦值的操作,當assign
修飾@property
時押蚤,它會告訴編譯器如何合成屬性的setter
實現(xiàn)蔑歌,基礎數(shù)據(jù)類型一般分配在棧上,棧的內(nèi)存會由系統(tǒng)自己自動處理揽碘,不會造成野指針次屠。
那么為什么Debug
版本和Release
版本會出現(xiàn)兩種不同的結果??
assign
是指針賦值贞绳,被assign
修飾的對象, 在釋放之后,指針的地址還是存在的鬓照,也就是說指針并沒有被置為nil
熔酷,造成野指針孤紧。而且對象一般分配在堆上的某塊內(nèi)存豺裆,如果在后續(xù)的內(nèi)存分配中,剛好分到了這塊地址号显,程序就會崩潰掉臭猜。assign
僅僅完成一個變量賦值的操作,當assign
修飾@property
時押蚤,它會告訴編譯器如何合成屬性的setter
實現(xiàn)蔑歌,基礎數(shù)據(jù)類型一般分配在棧上,棧的內(nèi)存會由系統(tǒng)自己自動處理揽碘,不會造成野指針次屠。Debug
版本和Release
版本會出現(xiàn)兩種不同的結果??我猜測可能和兩種版本的內(nèi)存管理有關,release
版本的內(nèi)存內(nèi)部管理更加嚴格雳刺,一旦空出來一塊內(nèi)存空間劫灶,馬上使用,才會導致程序崩潰掖桦,不過這也僅僅是猜測本昏。
參考:
http://blog.csdn.net/sinat_30162391/article/details/50667087
http://stackoverflow.com/a/15541801/5353887
http://www.reibang.com/p/3e0f12e5faaa