iOS 堆和棧的區(qū)別?

前言

堆和棧是什么?有什么區(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ū)別

棧是吃了吐 堆是吃了拉

雖然不是很文雅,湊合著理解,湊合著看吧!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • OC對(duì)象存放于堆里面(堆內(nèi)存要程序員手動(dòng)回收) 非OC對(duì)象一般放在棧里面(棧內(nèi)存會(huì)被系統(tǒng)自動(dòng)回收) 堆里面的內(nèi)存是...
    可愛的活火山閱讀 657評(píng)論 0 1
  • 喜歡的話記得點(diǎn)贊 一、內(nèi)存管理:移動(dòng)設(shè)備的內(nèi)存及其有限,每一個(gè)APP所能占用的內(nèi)存是有限制的二、什么行為會(huì)增加AP...
    甘哲157閱讀 2,097評(píng)論 1 12
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,653評(píng)論 30 472
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虛擬機(jī)(JVM)垃圾回收器提供...
    簡(jiǎn)欲明心閱讀 90,388評(píng)論 17 311
  • 前兩天,有位很久沒聯(lián)系的師妹私信問我到底要不要讀研,并問我選對(duì)導(dǎo)師重不重要,也許在她和很多同學(xué)看來,如果跟不對(duì)導(dǎo)師...
    紫健閱讀 3,434評(píng)論 5 35

友情鏈接更多精彩內(nèi)容