堆和棧
全局(靜態)區
存放程序靜態分配的變量和全局變量。
棧區(stack)?
由編譯器自動分配并釋放
存放函數的參數值,局部變量等
當一個方法執行時,會建立自己的內存棧,在這方法內定義的變量,局部變量將會逐個放入這塊棧內存里,隨著方法的執行結束,這個方法的內存棧也將自然銷毀。
棧一般來說都是一個先進后出的隊列,后進入的數據,會被先釋放掉.棧區存放函數內的局部變量,形參和函數返回值.棧區的內存由系統自動管理釋放,內存的分配是連續的,且分配的內存地址是向下增長.申明的變量過了作用域范圍后內存便會自動釋放,不需要開發人員手動管理.
堆區(heap)?
大部分自定義的類都在堆中
比如在ios 中 alloc 都是存放在堆中。
在程序中創建一個對象時,這個對象將被保存到運行時數據區中,以便反復利用(因為對象的創建成本通常較大),這個運行時數據區就是堆內存。
堆內存中的對象不會隨方法的結束而銷毀,即使方法結束后,這個對象還可能被另一個引用變量所引用(在方法的參數傳遞時很常見),則這個對象依然不會被銷毀。只有當一個對象沒有任何引用變量指向它時,系統的垃圾回收器才會在合適的時候回收它。
iOS中數據是存在堆和棧中的,然而我們的內存管理管理的堆上的內存,棧上的內存并不是我們管理
非OC對象(基礎數據類型)存儲在棧上
OC對象存儲在堆上