iOS總結-記憶體的幾大區域
參考: https://www.jianshu.com/p/de1418dc031a
1.棧區(stack)由編譯器自動分配並釋放,存放函式的引數值,區域性變數等.棧是系統資料結構,對應執行緒/進場是唯一的.優點快速高效缺點資料不靈活 先進後出
棧空間分靜態分配和動態分配兩種
靜態分配是編譯器完成的,比如自動變數(auto)的分配
動態分配由alloca函式完成
棧的動態分配無需釋放,是自動的,也就是沒有釋放函式,棧的動態分配操作是不被鼓勵的
2.堆區(heap)有程式設計師分配和釋放,如果程式設計師不釋放,程式結束時,可能會由作業系統回收,比如在ios中alloc都是存在堆中
優點靈活方便,資料適應面廣泛,但是效率有一定降低
堆是函式庫內部資料結構,不一定唯一. 不同堆分配的記憶體無法互相操作,堆空間的分配總是動態的.
雖然程式結束時所有的資料空間都會被釋放回系統,但是精確的申請記憶體,釋放記憶體匹配是良好程式的基本要素.
3.全域性區(靜態區 static) 全域性變數和靜態變數的儲存是放在一起的,初始化的全域性變數和靜態變數存放子啊一塊區域,未初始化的全域性變數和靜態變數在相鄰的另一塊區域,程式結束後由系統釋放.
全域性區分為未初始化區全域性區: .bss段和初始化全域性區: data段. 如: int a 未初始化 int a = 10; 已初始化的
4.文字常量區 存放常量字串 程式結束後由系統釋放
5.程式碼區 存放函式的二進位制程式碼
棧區 由編譯器自動分配釋放 區域性變數是儲存在棧區的 方法呼叫的實參也是儲存在棧區的
堆區 由程式設計師分配釋放,如程式設計師不釋放, 會出現記憶體洩漏, 使用new方法建立的物件 被建立物件的所有成員變數
BSS段/資料段/程式碼段 程式結束後由系統釋放
只要棧的剩餘空間大於申請空間,系統就提供記憶體,否則棧溢位
棧就是 去飯館吃飯, 只管點菜
堆 是自己動手做飯