cocos2d x 3 0 記憶體管理

2021-06-22 01:27:46 字數 2133 閱讀 9006

參考文章:

cocos2d-x採用了引用計數機制來進行記憶體管理。每個物件都有乙個用來控制生命週期的引用計數器。在物件通過建構函式建立時,該物件的引用計數值就被賦值為1,表示物件是由建立者所引用。因為如scene、layer等類都是繼承自ref類,而c++中,乙個類的建構函式總是會先呼叫父類的建構函式,然後再執行自身**。而ref類中的無參建構函式,就是把引用計數值初始化為1。

retain(),令指標所指向的物件的引用計數值加1,表示獲取該物件的引用權。

release(),引用結束時,呼叫該方法使物件的引用計數值減1,表示釋放該物件的引用權。

autolease(),其作用就是將物件放入自動**池。cocos2d-x會保證每一幀結束後釋放一次**池,而呼叫了autorelease()方法的物件,將會在自動**池釋放的時候被釋放一次。但也只是釋放一次而已。

注意這樣一句話:當引用計數為0時,標誌著該物件的生命週期結束,自動觸發物件的**釋放。

疑問:怎麼自動觸發物件的**釋放?

解答:這是因為release()進行的操作是,先把引用計數減1,再判斷是否為0,如果為0,就用delete刪除物件。

工廠方法

工廠方法,泛指一切生成並返回乙個物件的靜態函式。

**1:

static helloworldscene* create()

**2:

static helloworldscene* create()

**3:

static helloworldscene* create()

**1,會造成記憶體洩露,當然可以在析構函式中delete。但是不知道在其他地方是否還有對該物件的引用,如果析構函式中釋放了該資源,那麼其他地方如果還有對該物件的引用,那麼就會發生錯誤。

**2,釋放了資源,再返回pret,此時pret是乙個野指標

**3,為了返回pret物件返回給接收者,需要對它進行一次autorelease操作。autorelease方法,物件直到自動**池釋放之前是不會被真正釋放掉的。我們可以有足夠的時間來對它進行retain操作以便接管pret物件的引用權(記得配對使用release)

來看一段**

scene* helloworld::createscene()

layer指標所指的物件,是通過helloworld::create()建立的,create()方法中使用了new和autolease()。

new會呼叫父類ref的預設無參建構函式,把引用計數值初始化為1。

此時layer所指物件的引用計數值為1。

scene->addchild(layer),layer被引用,那麼引用計數值應該加1,為什麼這裡不用retain()呢?因為addchild()裡已經為我們retain()了一次。而且對應的release()也不用我們考慮了。那麼此時的引用計數值自然就為2了。

在整個場景銷毀時,會把layer的引用計數值減1,那麼2-1=1,引用計數值變為1,而因為layer是autorelease的,及layer是放到自動釋放池的,自動釋放池的物件在每一幀結束後都會呼叫一次release,此時計數值為1的物件再進行一次release,計數值就變為0,而且呼叫了delete釋放物件資源。

所以這裡就要思考autorelease()的作用,看**3,試想一下,如果返回的helloworldscene物件沒有被引用,那麼引用計數值為1,且pret放到自動釋放池,那麼當前幀結束後就會對自動釋放池中的每個物件進行一次release,此時對pret所指的物件(計數值為1)進行一次release,就會把物件釋放掉了。不會造成記憶體洩露。

在new物件以後,使用autorelease(),就不用考慮何時delete的問題。剩下要做的,就是我們自己手動retain()和release(),物件增加了一次引用,就retain()一下,記得retain()和release()是配對出現的,有retain()就有release(),一般release()可以在析構函式中進行。

另外,autorelease只會在下一幀減1,而不是每一幀都減1。

cocos2d x3 0之記憶體拷貝

3.0模仿object c的痕跡少了,看上去更c 了,這是官方說滴。object減少了那麼多複雜的功能,我認為還得拆分。不過cocos2d x正朝著這個方向努力。比如原來的object public copying就被乾掉了。並不是一切東西我們都希望可拷貝的。現在換成了組合的模式,比如 class ...

cocos2d x3 0之object記憶體管理

看object類的實現就行了。首先映入眼簾的是它們 protected count of references unsigned int reference count of autorelease unsigned int autoreleasecount 然後我們先看下 reference都在 ...

cocos2d x 3 0 編譯問題

3.0最主要的問題是它引進了c 11 所有ndk版本必須是r8e版本以上,即使你已經有這些已經準備好,還要注意一點是ndk編譯的時候預設採用ndk toolchain version 4.6的形式去編譯,這個時候就會出現 error thread in namespace std does not ...