【问题标题】:Cocos2dx memory management, how to use destructors and when to release objects?Cocos2dx内存管理,如何使用析构函数以及何时释放对象?
【发布时间】:2013-11-17 22:14:47
【问题描述】:

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

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

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

那么既然我使用了 create() 我应该在某个地方发布它吗?也许在 CCLayer 的析构函数中?还是我与此无关?

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

【问题讨论】:

    标签: c++ cocos2d-x destructor


    【解决方案1】:

    事情是这样的,

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

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

    现在,当您使用 create 方法创建 Ref 或派生类的新对象时,它已经添加到 autorelease 池中,您不需要在任何地方 release 它或 delete 它。在下面Node的创建函数中可以看到。

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

    但是当你使用'new'创建新对象时,你肯定需要在使用结束后delete它。尽管不建议使用 allocate 的 New to 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();
    

    第二件事,

    当您的对象被添加到autorelease 池中但您需要增加其范围时,您可以只保留它,这会将其保留计数增加一,然后您必须手动释放它,即,在它之后减少其保留计数使用结束。

    第三件事,

    每当您添加子对象时,它都会自动保留,但您不需要release 它而是如上所述从父对象中删除它。

    官方文档是下面的@link。

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

    【讨论】:

    • 我能找到的关于这个主题的最简单、最完整的答案。
    【解决方案2】:

    对不起,我的英语很差!

    1.调用CCSprite::create(...);addChild(...);,CCLayer销毁时this->sprite自动释放

    2.如果你有时想删除this->sprite,你可以这样称呼:

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

    【讨论】:

      【解决方案3】:

      Cocos2d-x 使用类objective-c 的内存管理系统,让变量有retain count。随着每个 cocos 主循环传递对象的保留计数递减,当它达到 1 时它被释放。包含另一个对象的 CCObject 通过增加它们的保留计数来使它们保持活动状态。这样 CCObjects 会保留自己,通常您无需担心内存管理。但是,在某些情况下,您希望关闭自动释放并使用 retain() 和 release() 手动管理 CCObjects 的生命周期。 cocos2d-x 有一些常见的情况会导致内存泄漏,例如让一个 CCObject 联系另一个 CCObject,从而使用 setUserObject() 保持第一个 CCObject 处于活动状态。因此,两者都不会被摧毁。

      因此,一般来说,在大多数情况下,最好还是坚持使用内置的 autorealse 模型并手动管理一些边缘情况,这通常会导致内存泄漏。另外,请记住,有相反的情况 - f.e.访问死的 ccobject 可能会导致运行时错误。

      题外话:访问成员/方法时不必写这个。

      【讨论】:

      • when it reaches 1 it's released 我认为何时到达0 而不是1。是吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 2014-06-05
      • 2011-09-06
      相关资源
      最近更新 更多