assign修飾OC對象時會導(dǎo)致程序崩潰!

原文地址: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é)果??

我猜測可能和兩種版本的內(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,835評論 0 4
  • 內(nèi)存管理 簡述OC中內(nèi)存管理機制。與retain配對使用的方法是dealloc還是release,為什么?需要與a...
    丶逐漸閱讀 2,080評論 1 16
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理。運行時機制的原理和運用場景。SDWebImage的原...
    LZM輪回閱讀 2,108評論 0 12
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,241評論 0 7
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,554評論 0 35

友情鏈接更多精彩內(nèi)容