我最近遇到了一个问题。我在cocos2d-x中经常使用vector STL。在我的一堂课上,我写道:
vector<StrokeDrawnode*> strokedrawList;StrokeDrawnode是从CCNode继承的。然而,我读到一些文章说,最好使用CCArray来保存CCObject的子类。实际上,我对内存管理有问题。我想这就是问题所在。因此,我的问题是,我应该在什么情况下使用CCArray,以及如何处理内存管理。
在什么情况下,我应该这样定义类成员?
CC_SYNTHESIZE_RETAIN(CCSprite* , m_sprite_draw, Sprite);发布于 2014-03-27 09:59:26
在本例中,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; \
} \
} 它为外部使用的变量创建了一个setter和一个getter。在我看来,只有当您想要将一个变量公开给外部使用并自动提供此方法时,它才是可行的。这里的附加值当然是在setter中完成的retain - release过程。
如果有什么不清楚的话请告诉我!干杯。
https://stackoverflow.com/questions/22681078
复制相似问题