iOS堆和棧的區別

2021-09-03 02:21:24 字數 938 閱讀 8482

建立乙個oc物件

定義乙個變數

呼叫乙個函式或者方法

記憶體管理範圍

任何繼承了nsobject的物件

對其它非物件型別無效

簡單來說:

只有oc物件需要進行記憶體管理

非oc物件型別比如基本資料型別不需要進行記憶體管理

引入堆和棧的概念

所以問題就來了,為什麼oc物件需要進行記憶體管理,而其它非物件型別比如基本資料型別就不需要進行記憶體管理呢?

只有oc物件才需要進行記憶體管理的本質原因?

因為:objective-c的物件在記憶體中是以堆的方式分配空間的,並且堆記憶體是由你釋放的,就是release

oc物件存放於堆裡面(堆記憶體要程式設計師手動**)

非oc物件一般放在棧裡面(棧記憶體會被系統自動**)

堆裡面的記憶體是動態分配的,所以也就需要程式設計師手動的去新增記憶體、**記憶體

舉例說明

該**塊在記憶體中的表現形式如下圖

圖中可以看到,棧裡面存放的是非物件的基本資料型別,堆記憶體存放著oc物件

當**塊一過,裡面的a,b,*c指標都會被系統編譯器自動**,因為它存放在棧裡面,而oc物件則不會被系統**,因為它存放堆裡面,堆裡面的記憶體是動態儲存的,所以需要程式設計師手動**記憶體

總結區別

按管理方式分

對於棧來講,是由系統編譯器自動管理,不需要程式設計師手動管理

對於堆來講,釋放工作由程式設計師手動管理,不及時**容易產生記憶體洩露

按分配方式分

堆是動態分配和**記憶體的,沒有靜態分配的堆

棧有兩種分配方式:靜態分配和動態分配

靜態分配是系統編譯器完成的,比如區域性變數的分配

動態分配是有alloc函式進行分配的,但是棧的動態分配和堆是不同的,它的動態分配也由系統編譯器進行釋放,不需要程式設計師手動管理

一位網友用10個字總結了堆和棧的區別

棧是吃了吐 堆是吃了拉

iOS 棧和堆的區別

ios中 堆和棧簡介 1.管理方式 對於棧來講,是由編譯器自動管理,無需我們手工控制 對於堆來講,釋放工作有程式設計師控制,容易產生memory leak。2.申請大小 棧 在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域。這句話的意思是棧頂上的位址和棧的最大容量是系統預先...

iOS中堆和棧的區別

管理方式 對於棧來講,是由編譯器自動管理,無需我們手工控制 對於堆來講,釋放工作有程式設計師控制,容易產生memory leak。申請大小 棧 在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域。這句話的意思是棧頂上的位址和棧的最大容量是系統預先規定好的,在windows下,...

iOS中堆和棧的區別

管理方式 對於棧來講,是由編譯器自動管理,無需我們手工控制 對於堆來講,釋放工作有程式設計師控制,容易產生memory leak。申請大小 棧 在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域。這句話的意思是棧頂上的位址和棧的最大容量是系統預先規定好的,在windows下,...