Cocos2dx内存管理,如何使用析构函数以及何时释放对象?

时间:2013-11-17 22:14:47

标签: c++ cocos2d-x destructor

我正在阅读网络和文档,但说实话,我不明白。由于我是cocos2d-x的新手,我想更好地理解如何创建/保留对象以及我应该做些什么来释放它们(如果需要)。令我困惑的是使用我不太清楚的智能指针。

想象一下,在我的CCLayer中(添加到CCScene中)我添加了一个CCSprite,所以我这样做:

this->sprite = CCSprite::create("mySprite.png");
this->addChild(sprite);

然后因为我使用了create()我应该在某个地方发布它?在CCLayer的析构函数中可能吗?或者我与此无关?

我知道C ++的基础知识所以如果我做一个“新”对象,我实际上必须在析构函数中删除它,或者当我不再需要它时,但是cocos2dx对象呢?

3 个答案:

答案 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。

[http://www.cocos2d-x.org/wiki/Reference_Count_and_AutoReleasePool_in_Cocos2d-x#Refrelease-retain-and-autorelease][1]

答案 1 :(得分:1)

抱歉,我的英语很差!

1.如果您致电this->spriteCCSprite::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时不必写这个。