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

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

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

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