2014-03-27 69 views
0

我最近遇到了問題。我在cocos2d-x中使用了vector STL。而在我的課之一,我寫道:我應該使用CCArray在cocos2d-x中保存自定義的CCNode嗎?

vector<StrokeDrawnode*> strokedrawList; 

StrokeDrawnodeCCNode繼承。不過,我看了一些文章說,最好用CCArray來持有CCObject的子類。實際上,我對內存管理有問題。我猜這是問題所在。所以我的問題是我應該使用什麼情況CCArray以及我如何處理內存管理。

在什麼情況下我應該這樣定義類成員?

CC_SYNTHESIZE_RETAIN(CCSprite* , m_sprite_draw, Sprite); 
+0

我已閱讀wiki並瞭解了很多:http://www.cocos2d-x.org/wiki/CCArray – einverne

回答

1

在這種情況下std::vectorCCArray之間的主要區別是,當你添加對象CCArray他們得到保留。這在cocos中非常重要,因爲CCObject-dervied(基本上所有東西)對象在其retainCount達到0時會被銷燬。這是在每幀之間自動完成的。考慮這個例子:假設你想創建5個精靈並將它們緩存起來供以後使用(直到將來某個時候它們纔會出現在屏幕上)。代碼(在init()方法某處):

for(int i = 0; i < 5; ++i) { 

    CCSprite *vectorSprite = (...); 
    CCSprite *arraySprite = (...); 

    _vector.push_back(vectorSprite); 
    _array->addObject(arraySprite); 

} 

_array->retain(); // < ------- IMPORTANT! 

// end of init method 

當然,我們假設_vector_array是實例變量和不被摧毀時init()結束。

在繪製下一幀之前發生的事情是,我們放入_vector的所有精靈都將被破壞 - 矢量將保存指向無效內存位置的指針。

我們放入_array的對象不會,因爲addObject保留了我們。請注意,_array本身也必須保留,否則將被銷燬(我不確定其內容)。

通常,我認爲在使用cocos對象時使用cocos-containers可能會更好,因爲您只需記住保留容器本身,而不是所有對象。如果你真的想使用std::vector它可能是合理的子類std::vector,使其push_backpop_back方法將retainrealese您的對象分別。


至於宏 - 我從來沒有使用它,但它擴展到這一點:

#define CC_SYNTHESIZE_RETAIN(varType, varName, funName) \ 
private: varType varName; \ 
public: virtual varType get##funName(void) const { return varName; } \ 
public: virtual void set##funName(varType var) \ 
{ \ 
    if (varName != var) \ 
    { \ 
     CC_SAFE_RETAIN(var); \ 
     CC_SAFE_RELEASE(varName); \ 
     varName = var; \ 
    } \ 
} 

它創建了一個二傳手,併爲您的外部使用可變吸氣。在我看來,如果你想將一個變量暴露給外部使用,並且自動爲你提供這種方法,它似乎是唯一可行的。這裏的附加價值當然是在制定者中完成的retain - release過程。

讓我知道如果有什麼不清楚! 乾杯。

相關問題