借用月月的圖.png
介紹內(nèi)存的五大區(qū)域:棧區(qū),堆區(qū),靜態(tài)區(qū),常量區(qū),代碼段
棧區(qū)
- 局部變量和方法實(shí)參
棧區(qū)特點(diǎn):
- 存儲空間有限 . iphone的棧區(qū)大小只有512k(默認(rèn)) ,非常有限
- 連續(xù)性步鉴,棧區(qū)的地址是連續(xù)的
- 地址分配從大到小. 棧區(qū)地址按照分配的順序,由大到小順序排列
- 訪問速度快.
- 系統(tǒng)管理. (棧區(qū)的內(nèi)存由系統(tǒng)管理)
棧的概念: 后進(jìn)先出/ 先進(jìn)后出
調(diào)用方法時棧區(qū)的工作原理
- 開啟棧幀
- 保存實(shí)參
- 保存局部變量
- 方法完成后彈棧,銷毀棧幀氛琢,釋放空間
堆區(qū)
- OC中使用new方法創(chuàng)建的對象,被創(chuàng)建對象的所有成員變量保存在堆區(qū)中
- 程序員手動申請空間
堆區(qū)特點(diǎn):
- 所有程序共享
- 存儲大數(shù)據(jù)
- 程序員管理: 堆區(qū)的內(nèi)存需要程序員管理
- 不連續(xù): 堆區(qū)的地址是不連續(xù)的
- 速度沒有棧區(qū)快: 堆區(qū)的訪問速度沒有棧區(qū)快,因?yàn)槲覀円L問堆區(qū)中創(chuàng)建對象的屬性, 必須先需要通過變量找到棧區(qū)的地址,再通過地址定位到到堆區(qū)中的某一個位置, 只有找個這個位置之后,我們才可以訪問到存儲到這個對象中屬性對應(yīng)的數(shù)值.由于有了 這個地址尋找的過程,所有速度沒有棧區(qū)的快.
靜態(tài)區(qū)
- 也叫BSS段
- 未被初始化的全局變量和靜態(tài)變量
- 全局變量和靜態(tài)變量,不管有沒有被初始化,都存放在BSS段中
常量區(qū)
- 也叫數(shù)據(jù)段
- 存儲已經(jīng)初始化的全局變量,靜態(tài)變量,常量
- 存儲常量
代碼段
- 代碼的二進(jìn)制文件(用來存儲程序的代碼/命令)
面試題目:分配和釋放
棧區(qū) (stack [st?k]): 由編譯器自動分配釋放
- 局部變量是保存在棧區(qū)的
- 方法調(diào)用的實(shí)參也是保存在棧區(qū)的
堆區(qū) (heap [hi?p]): 由程序員分配釋放喊递,若程序員不釋放,會出現(xiàn)內(nèi)存泄漏- 賦值語句右側(cè) 使用 new 方法創(chuàng)建的對象
- 被創(chuàng)建對象的所有 成員變量
BSS 段 : 程序結(jié)束后由系統(tǒng)釋放
數(shù)據(jù)段 : 程序結(jié)束后由系統(tǒng)釋放
代碼段:程序結(jié)束后由系統(tǒng)釋放- 程序 編譯鏈接 后的二進(jìn)制可執(zhí)行代碼