一.內存管理的方式ios
MRC 人工引用計數:內存的開闢和釋放由程序代碼無師自通控制,()程序員
ARC 自動引用計數(不是自動內存管理)(編譯器幫助程序員默認加了釋放代碼)數組
在C中使用malloc和freeiphone
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對象都有一個計數器,保留着當前被引用的數量.
自動釋放池的理解
autorelease pool 不是天生的,須要手動創立.只不過在新建一個iphone項目時,Xcode 會自動幫你寫好,它的真名是 NSAutoreleasePool
在ios程序運行過程當中,會建立平均數個池子,這些池子都是以棧結構存在的.(先進後出)
它內部有一個數組 (可變數組 ),用來保存聲明爲atuorelease的全部對象,若是一個對象聲名爲autorelease,系統所作的工做就是把這個對象加入到這個數組中去.
NSAutoreleasePool 自身在銷燬的時候,會遍歷一遍這個數組 .release數組中的每一個成員,若是此時數組中成員的retain count 爲1 ,那麼release以後,retain count 爲0 ,對象正式被銷燬.若是此時數組中成員的retain count 大於1,那麼release以後,retain count 大於 0,此對象依然沒有被銷燬,內存泄露.