Cocos2d x 对对象使用保留和释放
在cocos2d-X中使用对象的保留和释放是否有一般指导原则?在函数中创建对象时,函数返回时是否会立即清除函数内存。创建对象时,调用对象的retain函数,是否会在函数return之后保留对象Cocos2d x 对对象使用保留和释放,cocos2d-x,Cocos2d X,在cocos2d-X中使用对象的保留和释放是否有一般指导原则?在函数中创建对象时,函数返回时是否会立即清除函数内存。创建对象时,调用对象的retain函数,是否会在函数return之后保留对象 P> >一般在C++中你有这样的行为: void foo() { Object a; Object *pA = new Object(); (…) } 这将导致a在函数结束时自动销毁,因为它是在堆栈上分配的。*pA不会被销毁,因为它是在堆上分配的(因此,您只会失去对它的引用,
<> 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);
}
这里发生的是:
b
精灵被添加到这个对象(比如说一个CCLayer)
a
的引用计数==0,因此它将删除它retain()
,这将提高其引用计数器,从而将其从自动删除中保存。但是,您必须记住对其调用release()
(例如,当将其作为子项添加时)
您必须记住的一般事项是:
retain()
的每次调用都需要与release()
配对CC\u SAFE\u DELETE(object)
autorelease
池,该池将排出retain count=0
的对象,该对象是一个变量,用于检查COCOCOS2DX
对象的范围
现在,当您使用create方法创建新对象时,它已经添加到自动释放池中,您不需要在任何地方释放或删除它,就像java中的垃圾收集器一样,它会在您背后处理垃圾对象
但是,当您使用“new”创建新对象时,您肯定需要在其析构函数中释放它,或者在其使用结束后释放它
第二件事
当您的对象被添加到自动释放
池中,但您需要在其他地方保留它时,您可以将其保留计数增加1,然后您必须在其使用结束后手动释放它
第三件事
无论何时添加子对象,它都会自动保留,但您不需要释放它,而是将其从父对象中移除。我在这个主题上看到的最清晰的解释(我第一次读到维护循环!)。谢谢你,谢谢你澄清这一点。完美、简洁、中肯