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