前言
堆和棧是什么?有什么區(qū)別?是干嘛的?啥東西呀這是?別急,慢慢看下去
內存管理
移動設備的內存及其有限,每一個APP所能占用的內存是有限制的
(吐槽一下:iPhone6s還是16G起步,還好我也買不起->_-> 扯遠了~~~)
什么行為會增加APP的內存占用
- 創(chuàng)建一個oc對象
- 定義一個變量
- 調用一個函數(shù)或者方法
內存管理范圍
- 任何繼承了NSObject的對象
- 對其它非對象類型無效
- 簡單來說:
- 只有oc對象需要進行內存管理
- 非oc對象類型比如基本數(shù)據(jù)類型不需要進行內存管理
引入堆和棧的概念
- 所以問題就來了,為什么OC對象需要進行內存管理,而其它非對象類型比如基本數(shù)據(jù)類型就不需要進行內存管理呢?
- 只有OC對象才需要進行內存管理的本質原因?
因為:
Objective-C的對象在內存中是以堆的方式分配空間的,并且堆內存是由你釋放的,就是release
OC對象存放于堆里面(堆內存要程序員手動回收)
非OC對象一般放在棧里面(棧內存會被系統(tǒng)自動回收)
堆里面的內存是動態(tài)分配的,所以也就需要程序員手動的去添加內存、回收內存
舉例說明

圖1
該代碼塊在內存中的表現(xiàn)形式如下圖

image
圖中可以看到,棧里面存放的是非對象的基本數(shù)據(jù)類型,堆內存存放著oc對象

image
當代碼塊一過,里面的a,b,*c指針都會被系統(tǒng)編譯器自動回收,因為它存放在棧里面,而OC對象則不會被系統(tǒng)回收,因為它存放堆里面,堆里面的內存是動態(tài)存儲的,所以需要程序員手動回收內存
總結區(qū)別
- 按管理方式分
- 對于棧來講,是由系統(tǒng)編譯器自動管理,不需要程序員手動管理
- 對于堆來講,釋放工作由程序員手動管理,不及時回收容易產生內存泄露
- 按分配方式分
- 堆是動態(tài)分配和回收內存的,沒有靜態(tài)分配的堆
- 棧有兩種分配方式:靜態(tài)分配和動態(tài)分配
- 靜態(tài)分配是系統(tǒng)編譯器完成的,比如局部變量的分配
- 動態(tài)分配是有alloc函數(shù)進行分配的,但是棧的動態(tài)分配和堆是不同的,它的動態(tài)分配也由系統(tǒng)編譯器進行釋放,不需要程序員手動管理
一位網友用10個字總結了堆和棧的區(qū)別
棧是吃了吐 堆是吃了拉