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