cocos2d x記憶體管理初步窺探之retai

2021-07-03 13:11:21 字數 1164 閱讀 8797

今天在使用ccarray的時候發現,在乙個類中使用ccarray作為乙個成員時,ccarray總會在初始化之後總會很詭異地被釋放掉了,於是找了一些相關的博文看了一下,也算是對cocos2d-x中的一些記憶體管理規則有了更深刻的理解。

aretain、release和autorelease都是繼承自ccobject這個基類的,具體負責的就是一些關於記憶體管理的工作。每個ccobject在被初始化時內部都有乙個計數器用來記載這個object被多少個人使用著。這計數器在乙個object被new出來的時候初始化為1,呼叫一次retain可以使計數器+1,呼叫一次release則相反。呼叫一次release之後如果計數器變為0,則這個object會被析構釋放掉。autorelease是一種特殊的release,特殊在於它不會馬上release,而會在遊戲主迴圈的時候release。呼叫的了autorelease的物件會被放入乙個管理池,以後就不用我們再手動去release它,系統會幫我們完成這個工作。

回到我們的問題,為什麼ccarray會被釋放掉呢?原因是一般來說ccarray只會作為乙個類的成員,不會被其他的ccobject所獲取,不像ccsprite和cclayer可以被當做兒子賣個某乙個父親。而ccarray的create函式裡面呼叫了autorelease(大部分類都是這樣的,例如ccsprite和cclayer),所以如果沒有別的物件去獲得這個物件,那麼ccarray就會在第一幀的時候被析構掉。所以我們應該在類的初始化函式中這樣寫:

this->objects = ccarray::createwithcapacity(30);

this->objects->retain();

表示當前這個物件獲得了ccarray,使ccarray的計數器+1。那麼下一幀的時候才不會被析構掉。當然我們在這個類的析構函式中應該加上

this->objects->release();

才能夠徹底析構掉ccarray;

我的理解是,你生成了乙個物件,那麼它的引用計數器就是1.其他物件獲得了它,計數器就要+1,被人拋棄時計數器要-1.呼叫autorelease理論上已經-1了,但是不是馬上減,而是在遊戲主迴圈的時候減。所以我們要在進入主迴圈之前讓它被別的物件獲得,才不會被析構掉。就像ccsprite,一般來說我們都會在構造之後把它add到父類節點,於是它就被別人獲得了,從而不會被析構。而ccarray一般來說不會被add到其他節點,所以我們要手動retain一次,才能讓它不被析構。

cocos2dx 記憶體管理

記憶體管理中經常遇到的問題 記憶體洩露,記憶體溢位。在cocos2dx中用的是引用計數和自動釋放池的技術,由於熟悉objective c語言,所以對這兩個概念不會很陌生。一 引用計數 引用計數是自動記憶體管理的基礎 在物件裡增加乙個引用計數,當外部引用增加時,計數器加1,當外部引用消失時,計數器減1...

cocos2d x 記憶體管理

呼叫了autorelease的物件,將會在自動 池釋放的時候被釋放一次。因為這個操作發生在 mainloop drawscene 後,這時候遊戲中所有的邏輯已經執行完畢,正是釋放無效資源的最佳時機。所以乙個物件被create後,將被放進pool中,其ref 數為1,當遊戲整個邏輯跑完,如果沒有增加r...

cocos2dx 記憶體管理

我們知道,cocos2dx中使用了引用計數的方式去管理記憶體,不需要我們手動delete的去釋放記憶體。那麼cocos2dx中是怎麼實現引用計數的記憶體管理方式的呢?cocos2dx中的記憶體管理用到了兩個工具 引用計數器 ref 自動 池 autoreleasepool 引用計數器 ref ref...