CrossApp內(nèi)存管理

2018-08-27 15:16 更新

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的原則。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)