cocos2d-x內存管理機制詳解

本篇文章純粹是自己在寫木頭的卡牌塔防的時候遇到問題的時候,才萌發心思瞭解關於cocos2d-x的內存管理機制;


       1.首先要想讓對象參與內存管理機制,必須要繼承Ref類(Node,Layer,等都繼承了該類);

       2.調用對象的autoRelease函數,對象就會被cocos2d-x內存管理機制給盯上,並且是在遊戲的每一幀都被盯上,沒人認領則將其殺死;

       3.如果不想其被殺死,則就要調用retain函數,這樣就被認領了,這樣就永遠不會被殺死,問題來了如果永遠不被殺死,則就要造成了內存泄露,則需要調用release函數

       4.addChild函數會調用retain函數。


問題來了:

    什麼時候調用retain函數?什麼時候調用release函數?

    解釋:

     當你把一個對象作爲成員變量時,並且沒有把對象的addChild到另外一個對象中,就需要調用retain函數。

  切記,必須調用了該對象的autoRelease函數之後,纔可以使用release和retain;


關於內存管理總結起來有4 個原則。
       1.‰‰誰創建,誰釋放。使用 new 構造出來的函數引用計數爲 1,需要調用 release 或者delete 釋放,Cocos2D-X 中封裝的create 函數中的步驟是先調用new 構造出來一個對象,因爲要符合“誰創建,誰釋放”的原則,而create 函數需要返回這個對象,不能 自己釋放自己創建的對象,所以要調用autorelease 將對象放入自動釋放池。也就是說create 出來的對象,如果不調用retain 函數,那麼下一幀(再次調用update 時)這個對象已經被自動釋放。
‰‰       2. 誰需要保留誰釋放。當一個對象被其他指針需要的時候該指針進行保留操作(retain),當不需要時進行release 釋放。需要注意的是,addChild 中已經調用了retain 函數,所以創建的Node 節點,不需要retain,直接傳遞給addChild 被加在父節點上就可以保留了。
‰‰       3.傳遞賦值時,需要先 retain 形參,後 release 原指針,最後賦值。
‰‰       4.自動釋放池 PoolManager。將對象置於自動釋放池中,每幀繪製結束,就自動釋放池中的對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章