前言:最近因為block多次出現問題,就決定好好的研究一下block的原理。自己獲得一些東西,分享一下,不足之處,請多多指教!
一、堆區、棧區 的區別
關于堆和棧的具體定義網上各路大神說的比較相近,這里提區別是為了后面關鍵字的區別做鋪墊
棧:
? 1、 需要手動釋放,不及時回收會造成內存泄漏。iOS為了解決這個問題,才有了自動釋放池的功能,自動釋放池其本質是代替程序員去做釋放。
?2、 棧的分配方式分為靜態分配和動態分配,靜態分配是由系統完成的,例如局部變量的分配;動態分配是由alloc函數進行分配,需要注意一點,棧的動態分配也是由系統自動釋放的,這和堆的動態分配回收是不同的。
堆:
1、手動釋放,不及時釋放,會造成內存泄漏。
2、堆是動態分配和回收內存,沒有靜態分配的堆。
二、關鍵字對blcck的影響?
1、無外部變量
可以看到 ,在沒有外部變量的情況下,三種關鍵字修飾后,都存在全局區。
2、有外部變量
? ?2.1 靜態變量(全局和部分),全局變量也是放在全局區,如上圖一樣。
2.2 ,其他外部變量?copy、strong修飾的block在堆區mallocBlock,weak修飾的block在棧區stackBlock,此時weak修飾的會奔潰,被提前釋放了。
weak存于棧區是根據奔潰反向推斷的,還沒有能驗證,等驗證后,補上驗證結果。
三 、結論
1.沒有外部變量的情況下,block屬于全局區
2 有外部變量的情況下
?2.1 無論全局變量、全局靜態變量、局部靜態變量,block依然在全局區
?2.2 普通外部變量 ,copy、strong修飾的block在堆區mallocBlock,weak修飾的block在棧區
本質:有普通外部變量的block,它創建后就是在棧區,只是copy、strong修飾的block會把它從棧區移動到堆區,而weak不會。
四、感謝
?感謝簡書上的大神提供的思路。