iOS 中的記憶體管理

Junyiii發表於2017-05-01

記憶體管理

記憶體分配方式有三種:

  1. 從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。
  2. 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內建於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
  3. 從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

Objective-C記憶體管理

區域性變數: 棧
全域性/靜態變數: 靜態全域性區
Objective-C 物件: 堆

物件和變數的區別

  • 物件是一段儲存空間
  • 變數由物件的宣告引入。變數的名稱表示物件。
NSObject *obj = [[NSObject alloc] init];複製程式碼

這行程式碼建立了一個 NSObject 型別的指標 obj 和一個 NSObject 型別的物件,obj 指標儲存在棧上,而其指向的物件則儲存在堆上(簡稱為堆物件)

Swift記憶體管理

Swift的記憶體管理基本和OC相同
由於引入了值型別和引用型別又變得複雜了一些.

  • 引用型別 堆上
  • 值型別總是分配在它宣告的地方

可能有小夥伴會疑惑:
引用型別的值型別呢?
值型別總是分配在它宣告的地方

見下表:
先明確兩組概念:

  1. 值型別/引用型別
  2. 區域性物件/屬性(物件或類)

接著明確 這兩組因素對 儲存位置的影響

因素 值型別 引用型別
區域性物件
屬性

值型別總是分配在它宣告的地方:作為欄位時,跟隨其所屬的變數(例項)儲存;作為區域性變數時,儲存在棧上。

注意:引用型別中的值型別欄位 也是儲存在堆上的.

為什麼棧的速度快?

  • 棧沒有碎片,定址間距短,可以被 CPU 預測行為
  • 棧可以利用到 CPU 的快取記憶體
  • 棧無需釋放記憶體和進行隨機定址
  • 棧記憶體清除只需移動指標

關於虛擬記憶體的補充

虛擬記憶體是計算機系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體(一個連續完整的地址空間),而實際上,它通常是被分隔成多個實體記憶體碎片,還有部分暫時儲存在外部磁碟儲存器上,在需要時進行資料交換。

但是iOS的虛擬記憶體,並沒有記憶體與外存資料交換的功能。

相關文章