使用保留和释放对象

时间:2014-01-13 07:37:43

标签: cocos2d-x

在cocos2d-X中是否有使用保留和释放对象的一般指导方针?在函数中创建对象时,函数返回的第二个函数是否被清除。创建对象时,调用对象的retain函数会保留对象超出函数return?

亲切的问候

2 个答案:

答案 0 :(得分:21)

通常在c ++中你有这种行为:

void foo() {
    Object a;
    Object *pA = new Object();
    (…)
 }

这将导致a在函数结束时自动销毁,因为它是在堆栈上分配的。 *pA不会被破坏,因为它是在堆上分配的(因此,你只是松开对它的引用,但对象本身仍然存在)。

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

示例:

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

    this->addChild(b);
}

这里发生的是:

  1. 创建了两个CCSprit,cocos知道它们。
  2. b精灵被添加到this对象(比如CCLayer)
  3. 该函数结束,没有对象被销毁(它们都在堆上)。
  4. 在此帧与下一帧之间的某处,维护运行。 Cocos清除了两个精灵并看到a引用计数== 0,因此它将删除它。
  5. 这个系统非常好,因为您不必担心内存管理。如果你想创建一个CCSprite(例如),但不想将其添加为子项,你可以在其上调用retain(),这会引发它的引用计数器,从而将其保存为自动删除。但是你必须记住在它上面调用release()(例如,将它作为孩子添加时)。

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

    1. 您对retain()的每次通话都需要与release()配对。
    2. 您通常不应自行删除CCObject。如果你觉得你需要,有一个方便的宏:CC_SAFE_DELETE(object)
    3. 所以简单地回答你的问题:

      1. 在cocos2d-X中是否有使用保留和释放对象的一般指导方针?

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

      2. 在函数中创建对象时,函数返回的函数内存是否被清除。

        对此的回答是上面的全文。

      3. 创建对象时,调用对象的retain函数,会保留超出函数返回的对象吗?

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

答案 1 :(得分:2)

这就是事情,

cocos2dx有一个autorelease池,用于排除retain count=0的对象,cocos2dx是一个变量,用于检查release对象的范围。

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

但是当你使用'new'创建新对象时,你肯定需要在它的析构函数中autorelease或者在它的使用结束后使用它。

第二件事,

当你的对象被添加到release池但你需要它在其他地方你可以保留它时,它会将其保留计数增加1,然后你必须在使用后手动{{1}}它结束了。

第三件事,

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

相关问题