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

12

我在网上和文档中阅读,但说实话,我不明白。由于我是cocos2d-x的新手,我希望更好地了解如何创建/保留对象以及如果需要释放它们应该做什么。让我困惑的是我对智能指针的使用不是很了解。

假设在我的CCLayer(添加到CCScene)中添加一个CCSprite:

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

那么既然我使用了 create(),我是否应该在某个地方释放它?也许是在 CCLayer 的析构函数中吗?还是我根本不需要管它?

我对 C++ 有一些基础知识,因此如果我“new”一个对象,实际上必须在析构函数中或在不再需要它时将其删除,但 cocos2dx 对象怎么样呢?

3个回答

22

事情是这样的,
class Ref 或其任何派生类的对象都有一个变量 _retainCount,它代表了对象的作用域。
此外还有一个自动释放池 autorelease,类似于 java 中的垃圾收集器。将对象添加到该 autorelease 池中的对象将在帧结束时被删除,除非其 _retainCount!=0
现在,当您使用 create 方法创建 Ref 或其派生类的新对象时,它已经被添加到 autorelease 池中,您不需要在任何地方 releasedelete 它。如下面 Node 的 create 函数所示。

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类的对象。而是使用create。

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,然后在使用结束后必须手动释放它,即将其保留计数减少。

第三点,每当您添加子节点时,它会自动保留,但您不需要释放它,而是从父节点中移除它,如上所述。

官方文档链接如下。

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


我能找到的关于这个主题最简单和最完整的答案。 - user1068477

1

抱歉,我的英语很差!

1.如果你调用CCSprite::create(...);addChild(...);,则当CCLayer销毁时,this->sprite将被自动释放。

2.如果您想有时删除this->sprite,可以调用以下代码:

this->sprite->removeFormParents();
this->sprite=NULL;

0
Cocos2d-x使用类似Objective-C的内存管理系统,因此变量具有保留计数。每次cocos主循环通过时,对象的保留计数会减少,当它达到1时,它就会被释放。包含其他对象的CCObject通过增加它们的保留计数来保持它们活跃。因此,CCObjects自己保持自己,并且通常不需要担心内存管理。然而,在某些情况下,您可能希望关闭自动释放并使用retain()和release()手动管理CCObjects的生命周期。
在cocos2d-x中,存在一些常见情况导致内存泄漏,比如一个CCObject与另一个CCObject联系,通过setUserObject()使第一个对象保持活跃。因此,两者永远不会被销毁。
所以,一般来说,大多数情况下最好使用内置的自动释放模型,并手动处理一些边缘情况,这些情况通常会导致内存泄漏。另外,请记住,也存在相反的情况 - 例如,访问一个已删除的ccobject可能会导致运行时错误。
离题:在访问成员/方法时,您不必写这个。

4
我认为当它达到0时才会被释放,不是1。是的吗? - Emadpres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接