iOS 中的內存管理

內存管理

內存分配方式有三種: 程序員

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

Objective-C內存管理

局部變量: 棧
全局/靜態變量: 靜態全局區
Objective-C 對象: 堆objective-c

對象和變量的區別swift

  • 對象是一段存儲空間
  • 變量由對象的聲明引入。變量的名稱表示對象。
NSObject *obj = [[NSObject alloc] init];複製代碼

這行代碼建立了一個 NSObject 類型的指針 obj 和一個 NSObject 類型的對象,obj 指針存儲在棧上,而其指向的對象則存儲在堆上(簡稱爲堆對象)緩存

Swift內存管理

Swift的內存管理基本和OC相同
因爲引入了值類型和引用類型又變得複雜了一些.函數

  • 引用類型 堆上
  • 值類型老是分配在它聲明的地方

可能有小夥伴會疑惑:
引用類型的值類型呢?
值類型老是分配在它聲明的地方ui

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

  1. 值類型/引用類型
  2. 局部對象/屬性(對象或類)

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

因素 值類型 引用類型
局部對象
屬性

值類型老是分配在它聲明的地方:做爲字段時,跟隨其所屬的變量(實例)存儲;做爲局部變量時,存儲在棧上。code

注意:引用類型中的值類型字段 也是存儲在堆上的.對象

爲何棧的速度快?

  • 棧沒有碎片,尋址間距短,能夠被 CPU 預測行爲
  • 棧能夠利用到 CPU 的高速緩存
  • 棧無需釋放內存和進行隨機尋址
  • 棧內存清除只需移動指針

關於虛擬內存的補充

虛擬內存是計算機系統內存管理的一種技術。它使得應用程序認爲它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它一般是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在須要時進行數據交換。

可是iOS的虛擬內存,並無內存與外存數據交換的功能。

相關文章
相關標籤/搜索