iOS 簡單而粗暴的說一說內存管理">iOS 簡單而粗暴的說一說內存管理

分類:IT技術 時間:2017-09-30

簡介:

既然是內存管理,首先要知道那麽內存是用來幹什麽的?內存具體管理的東西是什麽?當然這些東西基本都是常識了,內存當然是用來存儲數據的,內存要管理的東西簡單的說也就是如何將數據存儲到內存中(比如說我們的聲明變量就可以將數據存儲到內存中),其次存儲到內存中的數據怎樣釋放,什麽時候釋放,這都是內存管理需要來關心的,那麽本篇文章將簡單而粗暴的概述內存管理!(簡單說一下個人對內存管理的一些理解,無代碼示例,理解分享篇,有理解不恰當的地方請指出,感謝)

正文:

1.內存中的五大區域

內存分為5個區域,分別指的是----->棧區/堆區/BSS段/數據段/代碼段

棧:存儲局部變量,當其作用域執行完畢之後,就會被系統立即收回

堆:存儲OC對象,手動申請的字節空間,需要調用free來釋放

BSS段:未初始化的全局變量和靜態變量,一旦初始化就會從BSS段中回收掉,轉存到數據段中

數據段:存儲已經初始化的全局變量和靜態變量,以及常量數據,直到結束程序時才會被立即收回

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

2.OC中堆區存儲對象的特點

除了堆區,其他區域的中存儲的數據,都是又系統自動釋放的

堆區中的OC對象,是不會自動釋放的,如果不主動釋放,那麽將在程序結束的時候才去釋放

3.引用計數器

首先簡單來說一下,每一個OC對象都有一個屬性,叫做retainCount,翻譯過來也就是引用計數器,類型為unsigned long,占據8個字節,每一個對象負責維護對象所引用的記數值,當一個新的引用指向對象,那麽這個對象的引用值增加1,當我們新創建出一個對象的時候這個對象的引用計數器的值默認為1,當這個對象被少一次引用的時候那麽就先讓這個對象的引用記數值減1,當這個對象所引用的記數值為0的時候,代表這個對象沒有被使用,這時系統會自動回收掉此對象,回收這個對象的同時自動調用這個對象的dealloc方法

控制規則:

為對象發送一條retain消息,那麽對象的引用計數器的值就會+1

為對象發送一條release消息,那麽對象的引用計數器的值就會-1

為對象發送一條retainCount消息,那麽就可以得到這個對象的引用計數器的值

4.內存管理的分類

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

ARC:Autimatic Reference Counting 自動引用計數器,系統自動的改變對象引用計數器的值(iOS5之後),ARC是基於MRC的

5.內存管理基本原則

新創建一個對象,這個對象的引用計數器的值為1,有對象的創建,就需要匹配一個release

是誰來負責retain的,誰就要負責release,使用的時候retain,不是用的時候release

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

6.野指針

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

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

7.對象的回收

對象所占用的字節空間,分配給別人使用,系統未分配這塊空間被別人使用之前,這個對象的數據仍然處在內存中

8.僵屍對象

已經被收回但是這個對象的數據仍然處在內存中,像這樣的對象叫做僵屍對象

僵屍對象有可能可以訪問也有可能不可以訪問,當僵屍對象所占的內存空間還沒有分配給別人使用的時候,這個數據的對象其實仍然存在,通過指針仍然可以找到這個對象,所以說這個時候僵屍對象還可以被訪問,當這個僵屍對象已經分配給別人使用的時候,這個對象就不存在了,這個時候不可以被訪問

註意:一旦一個對象成為僵屍對象之後,這個對象無論如何都不應該被使用,無論有沒有分配給別人使用,都不能用!且不可以復活!

9.避免內存泄漏

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

當我們通過野指針去訪問僵屍對象的時候會報錯,為了避免報錯當一個指針成為野指針後,為這個指針賦值為nil

總結:

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

C博客地址


Tags: 內存 存儲 數據 對象 變量 釋放

文章來源:


ads
ads

相關文章
ads

相關文章

ad