使用保留和释放对象

And*_*Dev 5 cocos2d-x

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

亲切的问候

Los*_*aty 22

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

void foo() {
    Object a;
    Object *pA = new Object();
    (…)
 }
Run Code Online (Sandbox Code Playgroud)

这将导致在a函数结束时自动销毁,因为它是在堆栈上分配的.该*pA不会被摧毁,因为它是在堆上分配(因此,你只失去对它的引用,但对象本身仍然生活).

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

示例:

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

    this->addChild(b);
}
Run Code Online (Sandbox Code Playgroud)

这里发生的是:

  1. 创建了两个CCSprit,cocos知道它们.
  2. b子画面被添加到this对象(比如一个CCLayer)
  3. 该函数结束,没有对象被销毁(它们都在堆上).
  4. 在这个和下一个帧之间的某个地方,维护运行.Cocos chcecks两个sprite并看到a有引用计数== 0,所以它删除它.

这个系统非常好,因为您不必担心内存管理.如果你想创建一个CCSprite(例如),但不想把它作为子进程添加,你可以调用retain()它,这会引发它的引用计数器,从而将其保存为自动删除.但是你必须记住调用release()它(例如,当它作为一个孩子添加时).

你必须要记住的一般事情是:

  1. 您的每次通话retain()都需要配对release().
  2. 您通常不应该自己删除CCObjects.如果你觉得你需要,有一个方便的宏:CC_SAFE_DELETE(object)

所以简单地回答你的问题:

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

    是的,你通常不需要这样做.

  2. 在函数中创建对象时,函数返回的第二个函数是否被清除.

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

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

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