W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
CrossApp是用一種引用計數(shù)的方式來管理內(nèi)存對象,通過CAObject、CAAutoreleasePool、CAPoolManager來完成內(nèi)存的管理。
CAObject為引用計數(shù)類,在其構(gòu)造函數(shù)的時候,CAObject的引用計數(shù)為1,但此時并未加入到自動釋放池里,所有自動引用計數(shù)為0
在使用create創(chuàng)建對象時候,會調(diào)用autorelease,將對象放到對象池,CAAutoreleasePool的隊列中接受管理。CAObject調(diào)用retain()則引用計數(shù)會增加1,調(diào)用release()引用計數(shù)會減少1.
CAAutoreleasePool是引擎初始化時創(chuàng)建了一個默認(rèn)的自動釋放對象列表,并把它加入到CAPoolManager里進(jìn)行管理。
引擎每次主循環(huán)都會有一次CAPoolManager中pool的清理,那些引用計數(shù)為0的CAObject都會被釋放掉。這就是CrossApp的內(nèi)
存管理機制。
CAObject
//屬性:
//引用數(shù)量
unsigned int m_uReference;
//自動引用數(shù)量
unsigned int m_uAutoReleaseCount;
//方法:
//引用計數(shù)+1
retain();
//引用計數(shù)-1
relesase();
//添加到自動釋放管理
autorelease();
//返回當(dāng)前的引用計數(shù)
retainCount();
同時引擎為了方便內(nèi)存管理,用一些關(guān)于內(nèi)存管理的函數(shù)和宏定義。
常見的函數(shù) | |
create(); | 內(nèi)包含autorelease()調(diào)用 |
insertSubview(); | 內(nèi)包含retain()調(diào)用 |
removeSubview(); | 內(nèi)包含relesase()調(diào)用 |
常見的宏 | |
#define CC_SAFE_DELETE(p) | do { if(p) { delete (p); (p) = 0; } } while(0) |
#define CC_SAFE_DELETE_ARRAY(p) | do { if(p) { delete[] (p); (p) = 0; } } while(0) |
#define CC_SAFE_FREE(p) | do { if(p) { free(p); (p) = 0; } } while(0) |
#define CC_SAFE_RELEASE(p) | do { if(p) { (p)->release(); } } while(0) |
#define CC_SAFE_RELEASE_NULL(p) | do { if(p) { (p)->release(); (p) = 0; } } while(0) |
#define CC_SAFE_RETAIN(p) | do { if(p) { (p)->retain(); } } while(0) |
還有專門用于適應(yīng)CrossApp的數(shù)據(jù)容器: CAVector、CAList、CADeque、CAMap 其使用方法類似于c++的vector、list、deque、map的用法,其根本不同在于其添加和移除時,遵循CrossApp的內(nèi)存管理原則。
假如我們有需求,需要我們自己手動管理一個對象指針的內(nèi)存,那么我們需要,retain()和relesase()在一個類中成對出現(xiàn),遵循誰負(fù)責(zé)retain誰就負(fù)責(zé)relesase的原則。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: