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)
这里发生的是:
b
子画面被添加到this
对象(比如一个CCLayer)a
有引用计数== 0,所以它删除它.这个系统非常好,因为您不必担心内存管理.如果你想创建一个CCSprite(例如),但不想把它作为子进程添加,你可以调用retain()
它,这会引发它的引用计数器,从而将其保存为自动删除.但是你必须记住调用release()
它(例如,当它作为一个孩子添加时).
你必须要记住的一般事情是:
retain()
都需要配对release()
.CC_SAFE_DELETE(object)
所以简单地回答你的问题:
在cocos2d-X中是否有使用保留和释放对象的一般指导方针?
是的,你通常不需要这样做.
在函数中创建对象时,函数返回的第二个函数是否被清除.
对此的回答是上面的全文.
当一个对象被创建时,调用该对象的retain函数,会保留超出函数返回的对象吗?
是的,将它作为一个孩子添加到另一个(以任何方式保留)对象.
归档时间: |
|
查看次数: |
4269 次 |
最近记录: |