我正在阅读网络和文档,但说实话,我不明白。由于我是cocos2d-x的新手,我想更好地理解如何创建/保留对象以及我应该做些什么来释放它们(如果需要)。令我困惑的是使用我不太清楚的智能指针。
想象一下,在我的CCLayer中(添加到CCScene中)我添加了一个CCSprite,所以我这样做:
this->sprite = CCSprite::create("mySprite.png");
this->addChild(sprite);
然后因为我使用了create()我应该在某个地方发布它?在CCLayer的析构函数中可能吗?或者我与此无关?
我知道C ++的基础知识所以如果我做一个“新”对象,我实际上必须在析构函数中删除它,或者当我不再需要它时,但是cocos2dx对象呢?
答案 0 :(得分:20)
这就是事情,
class Ref
的对象或从中派生的任何类都有一个变量_retainCount
,表示对象的范围。
还有一个autorelease
池,类似于java
中的垃圾收集器。添加到此autorelease
池的对象将在帧结束时删除。除非_retainCount!=0
现在,当您使用create方法创建Ref
或派生类的新对象时,它已添加到autorelease
池中,您不需要release
它或{{ 1}}它在任何地方。正如您在下面delete
的创建函数中看到的那样。
Node
但是当你使用'new'创建新对象时,你在使用它之后肯定需要Node * Node::create()
{
Node * ret = new (std::nothrow) Node();
if (ret && ret->init())
{
ret->autorelease();
}
else
{
CC_SAFE_DELETE(ret);
}
return ret;
}
。虽然不建议对delete
类的allocate
对象使用New。而是使用create。
cocos2d
然后,
Node* temp=Node::create();
或
temp->retain();
//your work...
temp->release();
第二件事,
当您的对象被添加到Node* temp=Node::create();
Node* tempChild=Node::create();
temp->addChild(tempChild);
//your work...
temp->removeFromParent();
池但是您需要增加其范围时您可以保留它,这会将其保留计数增加1,然后您必须手动释放它,即减少其保留计数使用结束后。
第三件事,
每当您添加对象时,它会自动保留,但您不需要autorelease
,而是将其从父级中移除,如上所述。
官方文档是@link。
答案 1 :(得分:1)
抱歉,我的英语很差!
1.如果您致电this->sprite
和CCSprite::create(...);
,当CCLayer销毁时,addChild(...);
将自动释放。
2.如果您希望有时删除this->sprite
,可以这样称呼:
this->sprite->removeFormParents();
this->sprite=NULL;
答案 2 :(得分:0)
Cocos2d-x使用类似于Objective-c的内存管理系统,因此变量具有保留计数。每个cocos主循环传递对象的保留计数减少,当它达到1时,它被释放。包含另一个对象的CCObject通过增加其保留计数来使它们保持活动状态。因此CCObjects保留了自己,通常你不需要担心内存管理。但是,有些情况下你想要关闭autorelease并使用retain()和release()手动管理CCObjects的生命周期。 cocos2d-x存在一些常见情况导致内存泄漏,例如让CCObject联系另一个CCObject,使用setUserObject()保持第一个CCObject存活。因此,两者永远不会被摧毁。
因此,一般来说,在大多数情况下,最好坚持使用内置的自动模型并手动管理一些边缘情况,这通常会导致内存泄漏。另外,请记住有相反的情况 - 例如访问死的ccobject会导致运行时错误。
Offtopic:访问member / method时不必写这个。