1.引用計數機制
要了解cocos2dx引用計數的機制,首先我們來看看ccobject這個類
class cc_dll ccobject : public cccopying
;
friend class ccautoreleasepool;
};
說明:●
當m_ureference=0時會自動釋放該物件,每引用一次物件的時候,m_ureference會+1,當object被建立,會初始化為1. ●
當m_uautoreleasecount !=0時表示該物件自動釋放(autorelease)。
●void retain(void) 對m_ureference+1操作,可以防止物件被釋放 ●
retaincount() 返回m_ureference值
● 跟蹤一下void release()方法,我們會發現是對引用計數m_ureference進行-1操作,為0時刪除物件
void ccobject::release(void)
}
2.使用引用計數手動管理記憶體
因此,如果我們想手動來管理記憶體的釋放,我們可以使用這樣子,
ccsprite* sprite1=new ccsprite();
sprite1->initwithfile("closenormal.png");
cclog("sprite1 retain:%d",sprite1->retaincount());//sprite1 retain:1
this->addchild(sprite1); //addchild會對引用計數+1,可以跟蹤看一下,最後會對object->retain()操作
cclog("sprite1 retain:%d",sprite1->retaincount());//sprite1 retain:2
sprite1->release();
cclog("sprite1 retain:%d",sprite1->retaincount());//sprite1 retain:1
this->removechild(sprite1); //對m_ureference進行-1,跟蹤一下會發現對object進行cc_safe_release()安全釋放操作
cclog("sprite1 retain:%d",sprite1->retaincount());//sprite1 retain:-17891602
new和release一般成對存在,
所以,new和release是好**!而手動記憶體管理一般不再使用retain。
3.自動管理autorelease
還記得helloworld裡面怎麼建立乙個sprite嗎?
ccsprite* psprite = ccsprite::create("helloworld.png");
跟蹤ccsprite::create()
ccsprite* ccsprite::create(const char *pszfilename)
cc_safe_delete(pobsprite);
return null;
}
上上面我們可以知道 :
create=new+autorelease
那麼autorelease是什麼呢,我們接著跟蹤進入autorelease方法:
ccobject* ccobject::autorelease(void)
進入其中的addobject方法
void ccpoolmanager::addobject(ccobject* pobject)
再進入
addobject方法
void ccautoreleasepool::addobject(ccobject* pobject)
然後我們可以發現倆個類:
ccpoolmanager
物件自動管理類,這個類顧名思義就知道是對
物件自動釋放池進行管理的類,它是乙個單例類,這裡用來返回ccautoreleasepool
ccautoreleasepool
物件自動管理(釋放)池。
從上面我們可以看到這樣一句,將object新增到m_pmanagedobjectarray 陣列
m_pmanagedobjectarray->addobject(pobject);
我們來看一下ccautoreleasepool 這個類
class cc_dll ccautoreleasepool : public ccobject
;
值得注意的是,這個類也是繼承自ccobject
,那麼顯然其記憶體管理形式也採用引用計數的。
這時看到類中的
m_pmanagedobjectarray
陣列,我們將物件autorelease後,都是將物件新增到這個陣列中的,所以說是物件自動管理(釋放)池。
再來回顧一下前面這個addobject方法
void ccautoreleasepool::addobject(ccobject* pobject)
首先是將物件新增到陣列中,然後將物件自動管理變數++,那麼物件的 m_uautoreleasecount =1,也就是表明其為自動管理物件。
然後對物件進行release,也即對物件的引用計數進行減1的操作,至於為什麼要釋放,這裡解釋下:
①首先乙個ccsprite物件被建立,使用的是new,那麼其引用計數 m_ureference=1。這個應該不難理解吧:ccsprite是繼承自ccobject,而在前面ccobject的構造方法中就知道,new建立乙個例項物件後,其引用計數m_ureference=1,而是否自動管理變數 m_uautoreleasecount=0(表示物件未新增到自動管理(釋放)池中自動管理)。
②接著物件autorelease,那麼就是將物件新增到自動釋放池中,而其中的:
m_pmanagedobjectarray
->
addobject
(pobject); 將被管理物件新增到自動管理池中的過程中(將物件新增到陣列中),其會對物件進行retain操作的,所以 m_ureference 就變成了 m_ureference=2。
③所以最後的release是為了將引用計數重新變成為1。這樣的話,從物件建立,到被放到物件自動管理池,引用計數依然為1,被管理值也為1(表徵物件是自動管理)。
不信的話,下面我們來跟蹤一下m_pmanagedobjectarray
->
addobject
(pobject)
void ccarray::addobject(ccobject* object)
進入
在進入
看到object->retain()方法了吧。
cocos2d x記憶體管理機制
c 記憶體機制,採用new關鍵字例項化的物件,必須在不使用的時候手動delete掉,否則new的時候開闢的記憶體就不能被 造成記憶體洩露 npc n1 new npc if exit 0 cocos2d x 記憶體管理的方式,cocos2d x採用引用計數的方式進行記憶體管理,當乙個物件的引用計數為...
cocos2dx 記憶體管理機制(2)
首先我們要知道,cocos2d x的引擎執行緒是單執行緒的,它不停的呼叫乙個主迴圈來繪製當前的scene 同時對一些自動釋放的物件進行管理。一 現在開始定位,我們知道win32 下cocos2dx程式入口 run方法裡面有這麼一句 ccdirector shareddirector mainloop...
cocos2dx 學習( )記憶體管理機制
一 題記 關於cocos2dx 的記憶體管理機制,想必大家都能清楚說出是通過引用計數 reference count 和自動釋放池 autoreleasepool 但是不知大家是否知道其中具體的執行的細節呢?反正在寫這篇blog之前我是一知半解的,而且在粗略的看了下 poolmanager 的原始碼...