建立乙個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下,...