簡介:

既然是內(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í))