在cocos2d-X中是否有使用保留和释放对象的一般指导方针?在函数中创建对象时,函数返回的第二个函数是否被清除。创建对象时,调用对象的retain函数会保留对象超出函数return?
亲切的问候
答案 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);
}
这里发生的是:
b
精灵被添加到this
对象(比如CCLayer)a
引用计数== 0,因此它将删除它。这个系统非常好,因为您不必担心内存管理。如果你想创建一个CCSprite(例如),但不想将其添加为子项,你可以在其上调用retain()
,这会引发它的引用计数器,从而将其保存为自动删除。但是你必须记住在它上面调用release()
(例如,将它作为孩子添加时)。
您必须记住的一般事项是:
retain()
的每次通话都需要与release()
配对。CC_SAFE_DELETE(object)
所以简单地回答你的问题:
在cocos2d-X中是否有使用保留和释放对象的一般指导方针?
是的,您通常不需要这样做。
在函数中创建对象时,函数返回的函数内存是否被清除。
对此的回答是上面的全文。
创建对象时,调用对象的retain函数,会保留超出函数返回的对象吗?
是的,将其作为孩子添加到另一个(以任何方式保留)对象。
答案 1 :(得分:2)
这就是事情,
cocos2dx有一个autorelease
池,用于排除retain count=0
的对象,cocos2dx
是一个变量,用于检查release
对象的范围。
现在,当你使用create方法创建新对象时,它已经被添加到自动释放池中,你不需要在任何地方发布或删除它,它就像java中的垃圾收集器一样,处理你背后的垃圾对象
但是当你使用'new'创建新对象时,你肯定需要在它的析构函数中autorelease
或者在它的使用结束后使用它。
第二件事,
当你的对象被添加到release
池但你需要它在其他地方你可以保留它时,它会将其保留计数增加1,然后你必须在使用后手动{{1}}它结束了。
第三件事,
无论何时向对象添加对象,它都会自动保留,但您不需要将其释放,而是将其从父对象中删除。