淺談內(nèi)存管理和自動釋放池的理解

剛剛開始寫東西,不敢說的太多太深,言多必失,最怕自己還會對別人有很大的誤導,這就很不好了,所以,如果對我的文章有疑問或者發(fā)現(xiàn)錯誤的地方,非常歡迎指出!!


一.內(nèi)存管理的方式

MRC ?人工引用計數(shù):內(nèi)存的開辟和釋放由程序代碼無師自通控制,()

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

在C中使用malloc和free

oc中內(nèi)存管理的機制

oc中提供了一個“引用計數(shù)”的機制來管理內(nèi)存的。

每一個對象都有一個引用計數(shù),對象在建立的時候引用計數(shù)為1,當引用計數(shù)為0的時候,對象將被系統(tǒng)統(tǒng)一銷毀,我們可以通過調(diào)用一些方法來操作引用計數(shù)的值。

引用計數(shù)加1的方法有 alloc ?copy ?retain ?以及其他類或?qū)ο蟮膹娨?,在arc中strong 相當于原來的 retain,weak相當于原來的assign,成員變量是弱指針.

alloc 為一個新對象分配內(nèi)存,并且它的引用計數(shù)為1,調(diào)用alloc方法,你便有對新對象的所有權(quán)

copy 制造一個對象的副本,該副本的引用計數(shù)為1,調(diào)用者具有對副本的所有 權(quán)

retain 使對象的引用計數(shù)加1,并且獲得對象的所有權(quán)

放棄所有權(quán)的方法:

release 使對象的引用計數(shù)減1,并且放棄對象的所有權(quán)

autorelease 使對象的引用計數(shù)在未來 的某個 時候 減1,并且在那個時候 放棄對象的所有權(quán)

注:arc中不允許調(diào)用release ,retain retainCount,

內(nèi)存管理對于C語言基本類型無效.

所有oc對象都有一個計數(shù)器,保留著當前被引用的數(shù)量.

二.自動釋放池的理解

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

在ios程序運行過程中,會創(chuàng)建平均數(shù)個池子,這些池子都是以棧結(jié)構(gòu)存在的.(先進后出)

它內(nèi)部有一個數(shù)組 (可變數(shù)組 ),用來保存聲明為atuorelease的所有對象,如果一個對象聲名為autorelease,系統(tǒng)所做的工作就是把這個對象加入到這個數(shù)組中去.

NSAutoreleasePool 自身在銷毀的時候,會遍歷一遍這個數(shù)組 .release數(shù)組中的每個成員,如果此時數(shù)組中成員的retain count 為1 ,那么release之后,retain count 為0 ,對象正式被銷毀.如果此時數(shù)組中成員的retain count 大于1,那么release之后,retain count 大于 0,此對象依然沒有被銷毀,內(nèi)存泄露.


ps:關于自動釋放池什么時候被調(diào)用?

其實就是當運行循環(huán)檢測到事件,就會自動創(chuàng)建自動釋放池,所有autorelease對象出了作用域之后都會被添加到自動釋放池,一次完整的運行循環(huán)結(jié)束之前,就會銷毀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容