最近在公司做一個掌上青蛙的遊戲項目,是採用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,
都可以考慮引入通過引
用計數來管理記憶體這一套機制,既簡單又有效。