对于在cocos2d-X中使用对象的保留和释放是否有任何一般指导?在函数中创建对象时,函数返回的第二个函数内存是否被清除是真的。当一个对象被创建时,调用该对象的retain函数将会保留超出函数返回的对象吗?对对象使用保留和释放
++你有这样的行为,亲切的问候
对于在cocos2d-X中使用对象的保留和释放是否有任何一般指导?在函数中创建对象时,函数返回的第二个函数内存是否被清除是真的。当一个对象被创建时,调用该对象的retain函数将会保留超出函数返回的对象吗?对对象使用保留和释放
++你有这样的行为,亲切的问候
一般在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);
}
这里发生的是这样的:创建
b
精灵被添加到this
对象(比如一个CCLayer)a
的引用计数== 0,因此它将其删除。这个系统相当不错,因为您不需要担心内存管理。如果你想创建一个CCSprite(例如),但是不能把它作为孩子添加,你可以调用retain()
,这会提高其引用计数器,从而避免自动删除。但是,你必须记得关于它的调用release()
(例如,当它添加为孩子时)。
你必须remeber有关的东西一般是:
retain()
每次调用需要与release()
配对。CC_SAFE_DELETE(object)
因此,要回答你的问题在短期:
是否有使用保留和释放对对象的任何一般性指导线cocos2d-X?
是,你通常应该不需要做。
当创建函数中的对象,这是真的,所述功能存储器被清除所述第二函数返回。
答案,这是上面的全部文本。
当创建一个对象,调用该保留对象的功能,将保留对象超出了函数的返回?
是的,因为会增加它作为一个孩子到另一个(保留以任何方式)的对象。
这里是东西,
cocos2dx有autorelease
池排水渠具有retain count=0
这是一个变量,以保持在检查cocos2dx
对象范围的对象。
现在,当您使用create方法创建新对象时,它已经添加到autorelease池中,并且您不需要释放它或将它删除到任何地方,它在java中的类似垃圾回收器会处理您背后的垃圾对象背部。
但是当你使用创建新对象“新”你一定要release
在其析构函数或者其使用后结束。
第二件事,
当你的对象添加到autorelease
游泳池,但你需要它在其他地方你可以只保留它,这增加了一个保留计数,然后你必须手动release
它使用后结束了。
第三件事,
无论何时添加子你的对象会自动保留,但你并不需要将其释放,而从父将其删除。
我在这个问题上看到了最清晰的解释(第一次阅读维护循环!)。谢谢。 – AGPX
感谢您的理解。完美,简洁并且重要 –
这就是我所说的一个很好的答案!感谢名单。 –