一.堆和棧的概述
棧:編譯器自動分配內(nèi)存,存放參數(shù)值以及局部變量的值,類似于數(shù)據(jù)結構中的棧,使用完成后由系統(tǒng)自動回收內(nèi)存.
堆:需要程序員手動的開辟和釋放內(nèi)存,存放全局變量和靜態(tài)變量等.
二.堆和棧存儲數(shù)據(jù)的特點:
棧:先入后出,CocoaTouch框架中對于導航控制器中控制器的維護就是采用了棧的方式,push代表入棧,pop代表出棧.只要棧的剩余空間大于申請的內(nèi)存空間,系統(tǒng)會為程序提供內(nèi)存,負責會內(nèi)存溢出.分配速度快,但是我們無法控制.
堆:先入先出,例如在CocoaTouch框架中Application類就維護的事件隊列就是采用了堆的形式.操作系統(tǒng)有一個記錄空閑地址的鏈表,當申請內(nèi)存地址時,系統(tǒng)首先會遍歷保存的鏈表,尋找第一個空間大于所申請空間的節(jié)點.然后將該節(jié)點的空間分配給程序,然后將這個節(jié)點從空閑鏈表的節(jié)點中刪除.分配速度慢,會產(chǎn)生內(nèi)存碎片但是可定制性高.
PS:動態(tài)分配和靜態(tài)分配的區(qū)別
在編譯器根據(jù)變量(對象)的類型確定內(nèi)存空間,叫做靜態(tài)分配.有些變量(對象)在編譯期無法確定對象的類型,也就無法確定需要分配給變量(對象)的內(nèi)存大小,只能在運行時分配,這就是動態(tài)分配.