cocos2d-x和objective-c的記憶體管理

來源:互聯網
上載者:User

     最近在公司做一個掌上青蛙的遊戲項目,是採用c++寫的cocos2d-x開發的,它是iPhone上cocos2d架構另一個語言版本的實現,最大的優勢是能實現跨平台運行,通過簡單的修改就可以在android和iPhone上跑了。

   
因為功能和介面和objective-c版本的差不多,所以在記憶體管理上也採用objective-c引用計數的機制來實現記憶體管理。仔細看了一下cocos2d-x的原始碼,確實寫的很好,程式碼群組織得很工整。它們所有類都是繼承自CCObject,
CCObject有retain(), release()和autorelease()等方法,和objective-c上的NSObject用法一致。每當CCObject對象初始化時它的引用計數reference-count為1,
調用retain()方法reference-count加1, 調用release()方法reference-count減1,當reference-count為0時釋放該對象記憶體。autorelease()方法的作用是對象放進CCAutoreleasePool中進行管理,每當一次繪圖結束後,CCPoolManager會對當前的記憶體池每個對象調用release()方法,一些reference-count為0的對象就會被記憶體釋放。

   
每當通過new, copy方法擷取一個對象時,都有義務在不用它的時候調用release()方法,如果我們是從其他方法中(例如靜態方法)就不要調用release()方法,除非之前調用了retain()方法來表示要擁有這個對象一段時間。自訂每個類裡的成員變數如果是繼承自CCObject,在賦新值之前要先對新值retain(),
然後對舊值release(),這兩個步驟不能省去或者調轉。定義方法要返回一個對象時,如果該對象是在方法裡通過new, copy來建立的,在返回該對象之前要調用autorelease()方法,例如很多類的靜態方法返回它的執行個體時,都已經調用了autorelease()方法。

   只要嚴格遵守以上規範,記憶體流失的問題應該是可以避免的,以後寫c++程式時候,即使沒有使用cocos2d-x,
都可以考慮引入通過引

用計數來管理記憶體這一套機制,既簡單又有效。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.