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

前言

堆和棧是什么?有什么區(qū)別?是干嘛的?啥東西呀這是?別急,慢慢看下去

內存管理

移動設備的內存及其有限,每一個APP所能占用的內存是有限制的

(吐槽一下:iPhone6s還是16G起步,還好我也買不起->_-> 扯遠了~~~)

什么行為會增加APP的內存占用

  • 創(chuàng)建一個oc對象
  • 定義一個變量
  • 調用一個函數(shù)或者方法

內存管理范圍

  • 任何繼承了NSObject的對象
  • 對其它非對象類型無效
  • 簡單來說:
    • 只有oc對象需要進行內存管理
    • 非oc對象類型比如基本數(shù)據(jù)類型不需要進行內存管理

引入堆和棧的概念

  • 所以問題就來了,為什么OC對象需要進行內存管理,而其它非對象類型比如基本數(shù)據(jù)類型就不需要進行內存管理呢?
  • 只有OC對象才需要進行內存管理的本質原因?

因為:Objective-C的對象在內存中是以堆的方式分配空間的,并且堆內存是由你釋放的,就是release
OC對象存放于堆里面(堆內存要程序員手動回收)
非OC對象一般放在棧里面(棧內存會被系統(tǒng)自動回收)
堆里面的內存是動態(tài)分配的,所以也就需要程序員手動的去添加內存、回收內存

舉例說明

圖1

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

image

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

image

當代碼塊一過,里面的a,b,*c指針都會被系統(tǒng)編譯器自動回收,因為它存放在棧里面,而OC對象則不會被系統(tǒng)回收,因為它存放堆里面,堆里面的內存是動態(tài)存儲的,所以需要程序員手動回收內存

總結區(qū)別

  • 按管理方式分
    • 對于棧來講,是由系統(tǒng)編譯器自動管理,不需要程序員手動管理
    • 對于堆來講,釋放工作由程序員手動管理,不及時回收容易產生內存泄露
  • 按分配方式分
    • 堆是動態(tài)分配和回收內存的,沒有靜態(tài)分配的堆
    • 棧有兩種分配方式:靜態(tài)分配和動態(tài)分配
      • 靜態(tài)分配是系統(tǒng)編譯器完成的,比如局部變量的分配
      • 動態(tài)分配是有alloc函數(shù)進行分配的,但是棧的動態(tài)分配和堆是不同的,它的動態(tài)分配也由系統(tǒng)編譯器進行釋放,不需要程序員手動管理

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

棧是吃了吐 堆是吃了拉

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

相關閱讀更多精彩內容

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

友情鏈接更多精彩內容