堆和棧的區別是什麼?

首先,討論的堆和棧指的是內存中的「堆區」和「棧區」,OC語言是C語言的超集,因此先了解C語言的內存模型的內存管理會有很大的幫助。C語言的內存模型分爲5個區:棧區、堆區、靜態區、常量區、代碼區。每一個區存儲的內容以下:程序員

一、棧區:存放函數的參數值、局部變量等,由編譯器自動分配和釋放,一般在函數執行完後就釋放了,其操做方式相似於數據結構中的棧。棧內存分配運算內置於CPU的指令集,效率很高,可是分配的內存量有限,好比iOS中棧區的大小是2M。編程

二、堆區:就是經過new、malloc、realloc分配的內存塊,編譯器不會負責它們的釋放工做,須要用程序區釋放。分配方式相似於數據結構中的鏈表。在iOS開發中所說的「內存泄漏」說的就是堆區的內存。數據結構

三、靜態區:全局變量和靜態變量(在iOS中就是用static修飾的局部變量或者是全局全局變量)的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域。程序結束後,由系統釋放。函數

四、常量區:常量存儲在這裏,不容許修改。對象

五、代碼區:存放函數體的二進制代碼。生命週期

 

堆和棧的區別:內存

一、堆空間的內存是動態分配的,通常存放對象,而且須要手動釋放內存。固然,iOS引入了ARC(自動引用計數管理技術)以後,程序員就不須要用代碼管理對象的內存了,以前MRC(手動管理內存)的時候,程序員須要手動release對象。另外,ARC只是一種中間層的技術,雖然在ARC模式下,程序員不須要像以前那麼麻煩管理內存,可是須要遵循ARC技術的規範操做,好比使用屬性限定符weak、strong、assigen等。所以,若是程序員沒有按ARC的規則併合理的使用這些屬性限定符的話,一樣是會形成內存泄漏的。開發

二、棧空間的內存是由系統自動分配,通常存放局部變量,好比對象的地址等值,不須要程序員對這塊內存進行管理,好比,函數中的局部變量的做用範圍(生命週期)就是在調完這個函數以後就結束了。這些在系統層面都已經限定住了,程序員只須要在這種約束下進行程序編程就好,根本就沒有把這塊內存的管理權給到程序員,確定也就不存在讓程序員管理一說。編譯器

 

從申請的大小方面講:內存管理

棧空間比較小;

堆空間比較大。

 

從數據存儲方面來講:

棧空間中通常存儲基本數據類型,對象的地址;

堆空間通常存放對象自己,block的copy等。

相關文章
相關標籤/搜索