OC記憶體管理

weixin_33860553發表於2018-08-29

1、什麼是記憶體管

程式在執行時候,一下行為會增加程式所佔記憶體:

——建立一個物件

——定義一個變數

——呼叫一個函式或者方法

然而裝置記憶體是有限的,而且每個應用程式所可以佔用的記憶體也是有限的

當程式所佔用的記憶體較多時,系統就會發出記憶體警告,這時就得回收一些不需要再使用的記憶體空間。比如回收一些不需要使用的物件、變數等

如果程式佔用記憶體過大,系統可能會強制關閉程式,造成程式崩潰、閃退現象,影響使用者體驗

所以這個時候需要記憶體管理來儘量降低記憶體的使用率來保證程式的正常執行和高效。

任何繼承自NSObject 的物件都需要進行記憶體管理

而其他非繼承NSObject物件的資料型別(nt、char、float、double、struct、enum等)則不需要記憶體管理

非物件不需要記憶體管理的原因:

原因是這些資料型別儲存在棧裡面,棧理的資料有系統自動分配釋放。

記憶體管理的機制:引用計數

引用計數器:

每個OC物件都會有一個引用計數器,引用計數器的值是整數,表示物件被引用的次數,即這個物件在多少個地方被使用。

引用計數器的增減:

    給物件傳送訊息,進行相應的計數器操作。

    Retain訊息:使計數器+1,改方法返回物件本身

    Release訊息:使計數器-1(並不代表釋放物件)

    retainCount訊息:獲得物件當前的引用計數器值

alloc:當一個類的物件建立,需要開闢記憶體空間的時候,會使用alloc,alloc是一個類方法,只能用類呼叫,它的作用是開闢一塊新的記憶體空間,並使這塊記憶體的引用計數從0增加到1,注意,是新的記憶體空間,每次用類alloc出來的都是一塊新的記憶體空間,與上一次alloc出來的記憶體空間沒有必然聯絡,而且上一次alloc出來的記憶體空間仍然存在,不會被釋放。

物件的銷燬:

    當OC物件的引用計數為0的時候,它將被銷燬,其所佔用的記憶體將被系統回收。

    當物件被銷燬時,系統會自動向物件傳送一條dealloc訊息,一般會重寫dealloc方法,在此方法裡面釋放        相關資源,dealloc方法裡面必須呼叫“ [super dealloc]; ”方法,並且在最後呼叫。一旦物件被銷燬,就不能     在使用它之前所佔據的空間,堅持使用會造成崩潰(野指標錯誤)。

記憶體管理的原則:

1⃣️、一個物件還在就不能被回收。

2⃣️、一個地方使用這個物件,這個物件就引用計數 +1

3⃣️、當你不在使用這個物件的時候,這個物件的引用計數 -1

誰建立,誰release:

1⃣️、如果你通過alloc,new,copy來建立了一個物件,那麼你就必須呼叫release或者autorelease方法

2⃣️、不是你建立的就不用你去負責

誰retain,誰release

只要你呼叫的retain,那麼無論這個物件是什麼時候生成的,你都要呼叫release方法。


2、自動記憶體管理

記憶體管理模型

給OC程式設計師的記憶體管理模型有三種

(1)自動垃圾手機(iOS環境不支援)

(2)手動引用計數和自動釋放池(MRC)

(3)自動引用計數器(ARC)


一、手動記憶體管理(Manual Reference Counting 簡稱:MRC)

1、引用計數器

系統會在一個OC物件的引用計數為0時,銷燬這個物件並回收其所佔記憶體釋放該空間。

當使用alloc ,retain 和 copy 建立一個物件的時候,其預設的引用計數就是1。

2、引用計數器操作

每當建立引用到物件就會給物件傳送一個retain訊息,使得引用計數+ 1

相關文章