iOS的內(nèi)存管理

內(nèi)存管理

內(nèi)存分配方式有三種:

從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量,static變量。
在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲單元自動被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。
從堆上分配,亦稱動態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用malloc或new申請任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free或delete釋放內(nèi)存。動態(tài)內(nèi)存的生存期由我們決定,使用非常靈活,但問題也最多。
Objective-C內(nèi)存管理

局部變量: 棧
全局/靜態(tài)變量: 靜態(tài)全局區(qū)
Objective-C 對象: 堆

對象和變量的區(qū)別
對象是一段存儲空間
變量由對象的聲明引入。變量的名稱表示對象。
NSObject *obj = [[NSObject alloc] init];
這行代碼創(chuàng)建了一個(gè) NSObject 類型的指針 obj 和一個(gè) NSObject 類型的對象,obj 指針存儲在棧上,而其指向的對象則存儲在堆上(簡稱為堆對象)

Swift內(nèi)存管理

Swift的內(nèi)存管理基本和OC相同
由于引入了值類型和引用類型又變得復(fù)雜了一些.

引用類型 堆上
值類型總是分配在它聲明的地方
可能有小伙伴會疑惑:
引用類型的值類型呢?
值類型總是分配在它聲明的地方

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

值類型/引用類型
局部對象/屬性(對象或類)
接著明確 這兩組因素對 存儲位置的影響

因素 值類型 引用類型
局部對象 棧 堆
屬性 堆 堆
值類型總是分配在它聲明的地方:作為字段時(shí),跟隨其所屬的變量(實(shí)例)存儲;作為局部變量時(shí),存儲在棧上。

注意:引用類型中的值類型字段 也是存儲在堆上的.
為什么棧的速度快?

棧沒有碎片,尋址間距短,可以被 CPU 預(yù)測行為
棧可以利用到 CPU 的高速緩存
棧無需釋放內(nèi)存和進(jìn)行隨機(jī)尋址
棧內(nèi)存清除只需移動指針
關(guān)于虛擬內(nèi)存的補(bǔ)充

虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的內(nèi)存(一個(gè)連續(xù)完整的地址空間),而實(shí)際上,它通常是被分隔成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲在外部磁盤存儲器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。

但是iOS的虛擬內(nèi)存,并沒有內(nèi)存與外存數(shù)據(jù)交換的功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容