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

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

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

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

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

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

最佳答案
这是事情,

类Ref的对象或从它派生的任何类都有一个变量_retainCount,它表示对象的范围.

还有一个自动释放池,类似于java中的垃圾收集器.添加到此自动释放池的对象将在帧结束时删除.除非_retainCount!= 0

现在,当您使用create方法创建Ref或派生类的新对象时,它已添加到自动释放池中,您无需在任何地方将其释放或删除.正如您在下面的Node的create function中看到的那样.

Node * Node::create()
{
    Node * ret = new (std::nothrow) Node();
    if (ret && ret->init())
    {
        ret->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(ret);
    }
    return ret;
}

但是当你使用’new’创建新对象时,你肯定需要在使用结束后删除它.虽然不建议使用New来分配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,然后你必须手动释放它,即在使用结束后减少它的保留计数.

第三件事,

无论何时向对象添加对象,它都会自动保留,但您不需要释放它,而是将其从父对象中删除,如上所述.

官方文档是@link.

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

转载注明原文:c++ Cocos2dx内存管理,如何使用析构函数以及何时释放对象? - 代码日志