iOS 記憶體管理 01

2021-08-13 22:10:45 字數 1086 閱讀 2175

一、概述

內部管理簡單來說就是計算機內部儲存的管理,我們從馮·諾依曼結構說起,馮·諾依曼結構指出了計算機由運算器、控制器、儲存器、輸入和輸出裝置幾大部件組成。拿 iphone 8 舉例來說,運算器和控制器合在一起就是 cpu(**處理器),執行記憶體為 3gb lpddr4 ram。而 64g 256g 為儲存rom。

馮·諾依曼結構還指出記憶體是用是cun對於我們開發者來說,指令基本就是**邏輯,資料基本就是變數

、常量之類了

二、通用記憶體基本原理

最簡單來說分為兩大部分:指令+資料。再細分一點,五部分:**(指令),初始化資料區,未初始化資料區,堆,棧。

三、ios 的記憶體管理

其實,ios的記憶體管理和其它作業系統大同小異。這裡按照蘋果文件所述,重點對堆記憶體分配整理下。

ios的記憶體管理分為幾個層面,從系統到libmalloc,arc環境下,編譯器也會幫助開發者做「力所能及」的優化處理。

首先,ios和其它系統一樣,作業系統核心會做虛擬儲存到物理記憶體的對映管理,並做記憶體分頁,每頁4k。多個頁構成乙個記憶體區塊統一管理,負責管理的物件是vm object,其中包含了pager、size、resident pages等諸多屬性。所有的記憶體分配最終都將交由系統來處理(比如vm_allocate/mach_vm_allocate)。

而開發中,在系統核心的基礎上,ios使用libmalloc。不管是objective-c的[nsobject alloc],還是c**的對記憶體分配,重任都會落到malloc庫上,釋放也是如此,最終都將使用malloc庫中的free()。malloc庫中有很多malloc的同族函式可以動態分配記憶體。malloc庫中定義了zone的概念,並實現了不同的zone(如nano zone和scalable zone),並根據記憶體需求的大小使用不通演算法對nano、tiny、small、large量級的記憶體進行分配和釋放管理。預設情況,在第一次呼叫malloc時,系統會生成乙個default zone,後續的預設分配在此進行。比如,malloc_zone_***()函式最終都對特定的zone進行分配操作,執行zone->***()。每個zone都以鍊錶的形式對已分配過的記憶體做cache處理,避免頻繁對核心系統發起申請。malloc的內部實現都是開源的,感興趣的可以去了解去看。

ios記憶體管理

引用計數 每個物件有乙個與之相關的整數,稱作 引用計數器 或者 保留計數器 當某段 需要訪問乙個物件時,該段 會將物件的保留計數器 1,表示需要訪問這個物件 當結束對該物件的訪問時,保留計數器 1,表示它不在訪問該物件 當保留計數器為0時,物件被銷毀,所佔記憶體被系統收回。當使用new retain...

iOS記憶體管理

前提 1 以下是針對cocoa物件,不包括core foundation 2 cocoa物件都是用引用計數來跟蹤物件的記憶體使用情況的。3 在子類裡面父類先初始化和後釋放的原則。自己想下為什麼 棧空間和堆空間的區別。我們說的記憶體管理都是基於堆空間的,因為函式內的棧空間是由編譯器自己控制的。關於co...

IOS 記憶體管理

範圍 任何繼承了nsobject的物件,對基本資料型別無效 原理 每個物件內部都儲存了乙個與之相關聯的整數,稱為引用計數器 當使用alloc new或者copy建立乙個物件時,物件的引用計數器被設定為1 給物件傳送一條retain訊息,可以使引用計數器值 1 給物件傳送一條release訊息,可以使...