iOS 簡單而粗暴的說一說內(nèi)存管理

簡介:

既然是內(nèi)存管理,首先要知道那么內(nèi)存是用來干什么的?內(nèi)存具體管理的東西是什么?當(dāng)然這些東西基本都是常識了,內(nèi)存當(dāng)然是用來存儲數(shù)據(jù)的,內(nèi)存要管理的東西簡單的說也就是如何將數(shù)據(jù)存儲到內(nèi)存中(比如說我們的聲明變量就可以將數(shù)據(jù)存儲到內(nèi)存中),其次存儲到內(nèi)存中的數(shù)據(jù)怎樣釋放,什么時候釋放,這都是內(nèi)存管理需要來關(guān)心的,那么本篇文章將簡單而粗暴的概述內(nèi)存管理?。ê唵握f一下個人對內(nèi)存管理的一些理解,無代碼示例,理解分享篇,有理解不恰當(dāng)?shù)牡胤秸堉赋?,感謝)

正文:

1.內(nèi)存中的五大區(qū)域

內(nèi)存分為5個區(qū)域,分別指的是----->棧區(qū)/堆區(qū)/BSS段/數(shù)據(jù)段/代碼段

棧:存儲局部變量,當(dāng)其作用域執(zhí)行完畢之后,就會被系統(tǒng)立即收回

堆:存儲OC對象,手動申請的字節(jié)空間,需要調(diào)用free來釋放

BSS段:未初始化的全局變量和靜態(tài)變量,一旦初始化就會從BSS段中回收掉,轉(zhuǎn)存到數(shù)據(jù)段中

數(shù)據(jù)段:存儲已經(jīng)初始化的全局變量和靜態(tài)變量,以及常量數(shù)據(jù),直到結(jié)束程序時才會被立即收回

代碼段:代碼,直到結(jié)束程序時才會被立即收回

2.OC中堆區(qū)存儲對象的特點(diǎn)

除了堆區(qū),其他區(qū)域的中存儲的數(shù)據(jù),都是又系統(tǒng)自動釋放的

堆區(qū)中的OC對象,是不會自動釋放的,如果不主動釋放,那么將在程序結(jié)束的時候才去釋放

3.引用計數(shù)器

首先簡單來說一下,每一個OC對象都有一個屬性,叫做retainCount,翻譯過來也就是引用計數(shù)器,類型為unsigned long,占據(jù)8個字節(jié),每一個對象負(fù)責(zé)維護(hù)對象所引用的記數(shù)值,當(dāng)一個新的引用指向?qū)ο?,那么這個對象的引用值增加1,當(dāng)我們新創(chuàng)建出一個對象的時候這個對象的引用計數(shù)器的值默認(rèn)為1,當(dāng)這個對象被少一次引用的時候那么就先讓這個對象的引用記數(shù)值減1,當(dāng)這個對象所引用的記數(shù)值為0的時候,代表這個對象沒有被使用,這時系統(tǒng)會自動回收掉此對象,回收這個對象的同時自動調(diào)用這個對象的dealloc方法

控制規(guī)則:

為對象發(fā)送一條retain消息,那么對象的引用計數(shù)器的值就會+1

為對象發(fā)送一條release消息,那么對象的引用計數(shù)器的值就會-1

為對象發(fā)送一條retainCount消息,那么就可以得到這個對象的引用計數(shù)器的值

4.內(nèi)存管理的分類

MRC:Manual Reference Counting 手動引用計數(shù)器,需要我們手動管理對象引用計數(shù)器的值

ARC:Autimatic Reference Counting 自動引用計數(shù)器,系統(tǒng)自動的改變對象引用計數(shù)器的值(iOS5之后),ARC是基于MRC的

5.內(nèi)存管理基本原則

新創(chuàng)建一個對象,這個對象的引用計數(shù)器的值為1,有對象的創(chuàng)建,就需要匹配一個release

是誰來負(fù)責(zé)retain的,誰就要負(fù)責(zé)release,使用的時候retain,不是用的時候release

retain的次數(shù)要和release次數(shù)想匹配,有加有減,做到平衡

6.野指針

在C中,聲明一個指針變量,沒有為這個指針變量初始化,那么這個指針變量的值也就是一個垃圾值,指針指向隨機(jī)的一塊空間,那么我們叫做野指針

在OC中,一個指針指向的對象被釋放了,那么這個指針叫野指針

7.對象的回收

對象所占用的字節(jié)空間,分配給別人使用,系統(tǒng)未分配這塊空間被別人使用之前,這個對象的數(shù)據(jù)仍然處在內(nèi)存中

8.僵尸對象

已經(jīng)被收回但是這個對象的數(shù)據(jù)仍然處在內(nèi)存中,像這樣的對象叫做僵尸對象

僵尸對象有可能可以訪問也有可能不可以訪問,當(dāng)僵尸對象所占的內(nèi)存空間還沒有分配給別人使用的時候,這個數(shù)據(jù)的對象其實仍然存在,通過指針仍然可以找到這個對象,所以說這個時候僵尸對象還可以被訪問,當(dāng)這個僵尸對象已經(jīng)分配給別人使用的時候,這個對象就不存在了,這個時候不可以被訪問

注意:一旦一個對象成為僵尸對象之后,這個對象無論如何都不應(yīng)該被使用,無論有沒有分配給別人使用,都不能用!且不可以復(fù)活!

9.避免內(nèi)存泄漏

有對象的創(chuàng)建,就必須要匹配一個release,retain和release的次數(shù)要匹配,不要隨便為一個指針賦值為nil,除非這個指針是野指針,在方法中不要隨意對傳入的對象進(jìn)行retain

當(dāng)我們通過野指針去訪問僵尸對象的時候會報錯,為了避免報錯當(dāng)一個指針成為野指針后,為這個指針賦值為nil

總結(jié):

細(xì)心,專注,責(zé)任!細(xì)心可以讓你可以想的周全,讓代碼更加安全,順通!專注讓你的思維更加活躍,讓代碼感覺像是你的家人!責(zé)任,既然把代碼當(dāng)作你的家人,那么就好好對待她!(q群150731459有興趣一起交流學(xué)習(xí))

C博客地址

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

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

  • 內(nèi)存管理的原理? 內(nèi)存空間總共有8塊區(qū)域,有兩個區(qū)域需要特別注意,一個就是堆空間,一個就是??臻g。棧里存放臨時變量...
    Carden閱讀 525評論 0 1
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時分配內(nèi)存(比如創(chuàng)建一個對象,會增加內(nèi)存占用)與...
    蚊香醬閱讀 5,813評論 8 119
  • 內(nèi)存管理的基本范圍和概念. 程序運(yùn)行過程中藥創(chuàng)建大量的對象, 和其他高級語言類似,在ObjC中對象存儲在堆區(qū),程序...
    ValienZh閱讀 962評論 0 2
  • 無雪的冬季, 藏匿著多情的你我, 在屋檐下、在寒風(fēng)里, 在這里…… 在一切可已觸摸的空間里, 零距離的接觸, 有著...
    青塵楓月閱讀 232評論 0 0
  • ·超鏈接 ·<a></a> -創(chuàng)建指向另一個文檔的鏈接 電影 在當(dāng)前窗口顯示 財經(jīng) 在新窗口顯示 官網(wǎng) 在i...
    cooore閱讀 200評論 0 0

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