cocos中所有的物件都是繼承自ref基類,ref的職責就是對物件進行引用計數管理
記憶體管理中最重要的是三個方法retain()、release()、autorelease()
在cocos中建立物件的標準流程是:
建立物件->初始化->新增到自動記憶體管理->返回建立成功的物件
就比如下面這段**1:建立node物件
//**1
node * node::
create()
else
return ret;
}
在**1中,我們只需要呼叫create方法就可以實現建立物件、初始化和自動管理記憶體。
在cocos中有的函式中直接使用了create的巨集定義,呼叫物件的create方法就可以執行**2,實現的功能和**1是一樣的。
//**2
#define create_func(__type__) \
static __type__* create() \
\ else \\}
**2中呼叫autorelease方法,將物件加入自動記憶體管理池自動管理。
**3是autorelease方法的實現
//**3
ref* ref::
autorelease()
首先看一下**4,poolmanager的getinstance方法
在**4中建立了poolmanager物件並呼叫了this的autoreleasepool方法(**5)
"cocos2d autorelease pool"是這個自動管理池的name
//**4
poolmanager* poolmanager::
getinstance()
return s_singleinstance;
}
在**5中可以看到先是對_managedobjectarray預留空間,然後將this加了進去
//**5
autoreleasepool::
autoreleasepool
(const std::string &name)
:_name
(name)
#if defined(cocos2d_debug) && (cocos2d_debug > 0)
,_isclearing
(false
)#endif
在**3中還呼叫了getcurrentpool方法用來獲取當前的記憶體管理池
//**6
autoreleasepool* poolmanager::
getcurrentpool()
const
然後把this加入到當前的記憶體管理池中作為乙個ref物件進行管理,如**7
//**7
void autoreleasepool::
addobject
(ref* object)
整個流程如下圖所示
自動記憶體管理的結構如下圖,用乙個棧來儲存多個自動記憶體管理池,在自動記憶體管理池中又有若干個ref物件。
在記憶體管理中主要是靠引用計數來記錄物件的使用情況,當乙個物件被create時會給它分配記憶體,並且會呼叫retain()方法讓引用計數+1;當呼叫release()時會讓引用計數-1,release時會檢查引用計數是否為0,引用計數為0時會呼叫delete刪除物件並釋放記憶體。
在每一幀結束時會清理當前的記憶體管理池,將每乙個ref物件的引用計數都-1,這幀結束之後,記憶體管理池中就沒有這個ref物件了,引用計數是ref自己的屬性,當下一次被release時如果引用計數=0,就會被釋放。
void director::
mainloop()
}void autoreleasepool::
clear()
}
retain()和release()只是幫助我們記錄乙個物件的引用次數,在程式中幾乎不用手動呼叫。 Cocos2d x學習小結 開始篇
想要學習cocos2d x,是因為在高中物理課上找不到某些物理定律的證明,例如歐姆定律。為此,我翻閱了稍高等級的物理教材,其中關於歐姆定律 r frac 的證明大體如下 把金屬導體中的質子視作相對靜止構成點陣的剛體,把電子視作可以在質子周圍自由穿梭,不時與質子進行完全彈性碰撞的剛體。當導體中沒有電場...
cocos2d x 學習筆記 一
最近有點閒,突然想嘗試搞搞手機遊戲方面的開發,於是下了個cocos2d x 2.2.6和 cocos2d x權威指南 先看書,翻了下目錄尼瑪16章。厄,對於這種工具框架類的學習,貌似我從來沒有按部就班慢慢學的習慣 照例,花了2,3小時看下大概概念,記錄下 1,背景知識,過 2,環境搭建,cocos2...
Cocos2d x 學習日記 一
csv被稱為 逗號分隔值 comma separated values,csv csv格式比較簡單,解碼使用字串的擷取和分析就可以完成,使用 stringf和 array等ref類,解析csv比較方便。string有如下函式 array componentsseparatedbystring con...