我应该使用CCArray在cocos2d-x中保存自定义CCNode吗?

时间:2014-03-27 07:39:58

标签: c++ cocos2d-x

我最近遇到了一个问题。我在cocos2d-x中经常使用vector STL。在我的一堂课中,我写道:

vector<StrokeDrawnode*> strokedrawList;

StrokeDrawnode继承自CCNode。但是,我读了一篇文章说最好使用CCArray来保存CCObject的子类。实际上,我的内存管理有问题。我想这就是问题所在。所以我的问题是我应该使用什么情况CCArray以及如何处理内存管理。

在什么情况下我应该像这样定义类成员?

CC_SYNTHESIZE_RETAIN(CCSprite* , m_sprite_draw, Sprite);

1 个答案:

答案 0 :(得分:1)

在这种情况下,std::vectorCCArray之间的主要区别在于,当您向CCArray添加对象时,它们会被保留。这在cocos中非常重要,因为CCObject - 当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; \
    } \
} 

为外部使用创建变量的setter和getter。在我看来,如果您想将变量暴露给外部使用并且自动为您提供此方法,那么它似乎是可行的。这里增加的值当然是在setter中完成的retain - release进程。

如果有什么不清楚,请告诉我! 欢呼声。