在這種情況下std::vector
和CCArray
之間的主要區別是,當你添加對象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_back
和pop_back
方法將retain
和realese
您的對象分別。
至於宏 - 我從來沒有使用它,但它擴展到這一點:
#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
過程。
讓我知道如果有什麼不清楚! 乾杯。
我已閱讀wiki並瞭解了很多:http://www.cocos2d-x.org/wiki/CCArray – einverne