Cocos2d x 对对象使用保留和释放

Cocos2d x 对对象使用保留和释放,cocos2d-x,Cocos2d X,在cocos2d-X中使用对象的保留和释放是否有一般指导原则?在函数中创建对象时,函数返回时是否会立即清除函数内存。创建对象时,调用对象的retain函数,是否会在函数return之后保留对象 P> >一般在C++中你有这样的行为: void foo() { Object a; Object *pA = new Object(); (…) } 这将导致a在函数结束时自动销毁,因为它是在堆栈上分配的。*pA不会被销毁,因为它是在堆上分配的(因此,您只会失去对它的引用,

在cocos2d-X中使用对象的保留和释放是否有一般指导原则?在函数中创建对象时,函数返回时是否会立即清除函数内存。创建对象时,调用对象的retain函数,是否会在函数return之后保留对象


<> P> >一般在C++中你有这样的行为:

void foo() {
    Object a;
    Object *pA = new Object();
    (…)
 }
这将导致
a
在函数结束时自动销毁,因为它是在堆栈上分配的。
*pA
不会被销毁,因为它是在堆上分配的(因此,您只会失去对它的引用,但对象本身仍然存在)

Cocos实现了一个称为“自动引用计数”的东西:每个cObject都有一个引用计数器和两个方法
retain()
release()
。其工作方式是,每次创建对象时,它都会在cocos structers(
CCPoolManager
)中注册。然后,在每一帧(绘制它们之间)都有一个维护循环,检查所有对象的引用计数器:如果它是
0
,这意味着(对cocos)没有其他对象引用它,因此可以安全地删除它。当您将对象用作
addChild
函数的参数时,对象的保留计数将自动增加

例如:

void cocosFoo() {
    CCSprite *a = CCSprite::create(…);
    CCSprite *b = CCSprite::create(…);

    this->addChild(b);
}
这里发生的是:

  • 创建了两个CCSprite,cocos知道它们
  • b
    精灵被添加到
    这个
    对象(比如说一个CCLayer)
  • 函数结束时,不会销毁任何对象(它们都位于堆上)
  • 在这帧和下一帧之间的某个地方,维护开始运行。Cocos chcecks将两个精灵都删除,并看到
    a
    的引用计数==0,因此它将删除它
  • 这个系统非常好,因为您不需要担心内存管理。如果您想创建一个CCSprite(例如),但尚未将其作为子级添加,则可以对其调用
    retain()
    ,这将提高其引用计数器,从而将其从自动删除中保存。但是,您必须记住对其调用
    release()
    (例如,当将其作为子项添加时)

    您必须记住的一般事项是:

  • 您对
    retain()
    的每次调用都需要与
    release()
    配对
  • 您通常不应该自己删除CCObject。如果您觉得需要,有一个方便的宏:
    CC\u SAFE\u DELETE(object)
  • 因此,简单地回答您的问题:

  • 在cocos2d-X中使用对象的保留和释放是否有一般指导原则

    是的,您通常不需要这样做

  • 在函数中创建对象时,函数返回时是否会立即清除函数内存

    以上是全文的答案

  • 创建对象时,调用对象的retain函数,是否会在函数return之后保留对象

    是的,将其作为子对象添加到另一个(以任何方式保留)对象也是如此

  • 事情是这样的

    cocos2dx有一个
    autorelease
    池,该池将排出
    retain count=0
    的对象,该对象是一个变量,用于检查
    COCOCOS2DX
    对象的范围

    现在,当您使用create方法创建新对象时,它已经添加到自动释放池中,您不需要在任何地方释放或删除它,就像java中的垃圾收集器一样,它会在您背后处理垃圾对象

    但是,当您使用“new”创建新对象时,您肯定需要
    在其析构函数中释放它,或者在其使用结束后释放它

    第二件事

    当您的对象被添加到
    自动释放
    池中,但您需要在其他地方保留它时,您可以将其保留计数增加1,然后您必须在其使用结束后手动
    释放它

    第三件事


    无论何时添加子对象,它都会自动保留,但您不需要释放它,而是将其从父对象中移除。

    我在这个主题上看到的最清晰的解释(我第一次读到维护循环!)。谢谢你,谢谢你澄清这一点。完美、简洁、中肯