2014-01-13 94 views
2

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

++你有这样的行为,亲切的问候

回答

16

一般在C:

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

这将导致a处于功能结束自动销毁,因为它是在堆栈中分配。 *pA不会被破坏,因为它被分配在堆上(因此,你只能放弃对它的引用,但对象本身仍然存在)。

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

例子:

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

    this->addChild(b); 
} 

这里发生的是这样的:创建

  1. 两个CCSprites,茯苓知道它们。
  2. b精灵被添加到this对象(比如一个CCLayer)
  3. 函数结束时,没有对象被销毁(两者正对堆)。
  4. 在这个帧和下一帧之间的某个地方,保养就会运行。科科斯将这两个精灵都分开,并看到a的引用计数== 0,因此它将其删除。

这个系统相当不错,因为您不需要担心内存管理。如果你想创建一个CCSprite(例如),但是不能把它作为孩子添加,你可以调用retain(),这会提高其引用计数器,从而避免自动删除。但是,你必须记得关于它的调用release()(例如,当它添加为孩子时)。

你必须remeber有关的东西一般是:

  1. 由你retain()每次调用需要与release()配对。
  2. 您通常不应该自己删除CCObjects。如果你觉得你需要有一个conveniece宏:CC_SAFE_DELETE(object)

因此,要回答你的问题在短期:

  1. 是否有使用保留和释放对对象的任何一般性指导线cocos2d-X?

    是,你通常应该不需要做。

  2. 当创建函数中的对象,这是真的,所述功能存储器被清除所述第二函数返回。

    答案,这是上面的全部文本。

  3. 当创建一个对象,调用该保留对象的功能,将保留对象超出了函数的返回?

    是的,因为会增加它作为一个孩子到另一个(保留以任何方式)的对象。

+1

我在这个问题上看到了最清晰的解释(第一次阅读维护循环!)。谢谢。 – AGPX

+1

感谢您的理解。完美,简洁并且重要 –

+1

这就是我所说的一个很好的答案!感谢名单。 –

1

这里是东西,

cocos2dx有autorelease池排水渠具有retain count=0这是一个变量,以保持在检查cocos2dx对象范围的对象。

现在,当您使用create方法创建新对象时,它已经添加到autorelease池中,并且您不需要释放它或将它删除到任何地方,它在java中的类似垃圾回收器会处理您背后的垃圾对象背部。

但是当你使用创建新对象“新”你一定要release在其析构函数或者其使用后结束。

第二件事,

当你的对象添加到autorelease游泳池,但你需要它在其他地方你可以只保留它,这增加了一个保留计数,然后你必须手动release它使用后结束了。

第三件事,

无论何时添加子你的对象会自动保留,但你并不需要将其释放,而从父将其删除。