oc的內存管理機制.及自動釋放池的解析

一.內存管理的方式ios

MRC  人工引用計數:內存的開闢和釋放由程序代碼無師自通控制,()程序員

ARC   自動引用計數(不是自動內存管理)(編譯器幫助程序員默認加了釋放代碼)數組

在C中使用malloc和freeiphone

  1. oc中內存管理的機制spa

oc中提供了一個「引用計數」的機制來管理內存的。指針

每個對象都有一個引用計數,對象在創建的時候引用計數爲1,當引用計數爲0的時候,對象將被系通通一銷燬,咱們能夠經過調用一些方法來操做引用計數的值。code

引用計數加1的方法有 alloc  copy  retain  以及其餘類或對象的強引用,在arc中strong 至關於原來的 retain,weak至關於原來的assign,成員變量是弱指針.對象

alloc 爲一個新對象分配內存,而且它的引用計數爲1,調用alloc方法,你便有對新對象的全部權ip

copy 製造一個對象的副本,該副本的引用計數爲1,調用者具備對副本的全部 權內存

retain 使對象的引用計數加1,而且得到對象的全部權

放棄全部權的方法:

release 使對象的引用計數減1,而且放棄對象的全部權

autorelease 使對象的引用計數在將來 的某個 時候 減1,而且在那個時候 放棄對象的全部權

注:arc中不容許調用release ,retain retainCount,

     內存管理對於C語言基本類型無效.

     全部oc對象都有一個計數器,保留着當前被引用的數量.

  1. 自動釋放池的理解


autorelease pool 不是天生的,須要手動創立.只不過在新建一個iphone項目時,Xcode 會自動幫你寫好,它的真名是 NSAutoreleasePool 

在ios程序運行過程當中,會建立平均數個池子,這些池子都是以棧結構存在的.(先進後出)

它內部有一個數組 (可變數組 ),用來保存聲明爲atuorelease的全部對象,若是一個對象聲名爲autorelease,系統所作的工做就是把這個對象加入到這個數組中去.

NSAutoreleasePool 自身在銷燬的時候,會遍歷一遍這個數組 .release數組中的每一個成員,若是此時數組中成員的retain count 爲1 ,那麼release以後,retain count 爲0 ,對象正式被銷燬.若是此時數組中成員的retain count 大於1,那麼release以後,retain count 大於 0,此對象依然沒有被銷燬,內存泄露.

相關文章
相關標籤/搜索