[2]Cocos2d-x之引用计算(referenceCount)的增减时机
2015-05-08 22:27
253 查看
总结:
1、当节点(节点指像Scene、Layer、Sprite等继承Node的子类)被创建时,引用计数(referenceCount)加1。
2、当节点添加到父节点或执行动作时,没错执行动作也会加1,引用计数加1。
3、当每一帧过后 AutoreleasePool会调用clear函数,将存放的ref的引用计数减1。这里的每一帧可以理解为每一个画面的切换。
测试代码基于cocos2d-x v3.3:
头文件:ActionTest.h
count should greater than 0"
1、当节点(节点指像Scene、Layer、Sprite等继承Node的子类)被创建时,引用计数(referenceCount)加1。
2、当节点添加到父节点或执行动作时,没错执行动作也会加1,引用计数加1。
3、当每一帧过后 AutoreleasePool会调用clear函数,将存放的ref的引用计数减1。这里的每一帧可以理解为每一个画面的切换。
测试代码基于cocos2d-x v3.3:
头文件:ActionTest.h
#ifndef __ACTIONTEST_H__ #define __ACTIONTEST_H__ #include "cocos2d.h" #include <iostream> USING_NS_CC; class ActionTest :public Layer{ public: CREATE_FUNC(ActionTest); bool init(); private: void moveByAndMoveTo(); Sprite* _pk1; Sprite* _pk2; }; #endif实现类:ActionTest.cpp
#include "ActionTest.h" bool ActionTest::init(){ auto s = Director::getInstance()->getWinSize(); _pk1 = Sprite::create("pk.png"); //创建节点,_pk1引用计数加1 CCLOG("pk1 ref count is %d", _pk1->getReferenceCount()); _pk1->setAnchorPoint(Vec2(0.5, 0.5)); _pk1->setPosition(Vec2(s.width/2, s.height/2)); _pk1->retain(); //调用retain(),_pk1引用计数加1 CCLOG("pk1 ref count is %d", _pk1->getReferenceCount()); auto moveByAndMoveToItem = MenuItemFont::create("moveByAndMoveToTest",CC_CALLBACK_0(ActionTest::moveByAndMoveTo,this)); auto menu = Menu::create(moveByAndMoveToItem,nullptr); menu->alignItemsVertically(); addChild(menu); return true; } void ActionTest::moveByAndMoveTo(){ auto s = Director::getInstance()->getWinSize(); auto scene = Scene::create(); auto layer = Layer::create(); _pk2 = Sprite::create("pk.png"); _pk2->setColor(Color3B::GREEN); _pk2->setPosition(Vec2(s.width, s.height / 2)); //创建Node,_pk2引用加一 CCLOG("pk2 ref count is %d", _pk1->getReferenceCount()); CCLOG("pk1 ref count is %d", _pk1->getReferenceCount()); scene->addChild(layer); layer->addChild(_pk1); layer->addChild(_pk2); //添加到父类,_pk2,_pk1引用加一 CCLOG("pk2add ref count is %d", _pk1->getReferenceCount()); CCLOG("pk1add ref count is %d", _pk1->getReferenceCount()); //MoveBy是向量改变值,沿着向量路径运动 auto mBy = MoveBy::create(3,Vec2(s.width/2,s.height/2)); //MoveTo是移动到特定点 auto mTo = MoveTo::create(3, Vec2(s.width / 2, s.height / 2)); _pk1->runAction(mTo); _pk2->runAction(mBy); //执行动作引用加一 CCLOG("pk2action ref count is %d", _pk1->getReferenceCount()); CCLOG("pk1action ref count is %d", _pk1->getReferenceCount()); Director::getInstance()->pushScene(scene); }注意:在init方法中调用retain方法,是因为调用init时_pk1的创建引用计数加一,但是其它类再引用_pk1时,引用数会变为0,因为autoreleasepool的cleae将引用计数减1,要再调用retain保持引用数大于0,不然会出现异常 "reference
count should greater than 0"
相关文章推荐
- 《Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)》读后感
- Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- [Cocos2D-X官方文档]:Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- (20)Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- Cocos2d: Assert failed: reference count should greater than 0 错误的解决
- CCObject(m_uReference(被引用次数) m_uAutoReleaseCount(加入释放池次数) release retain acceptVisitor)
- java持有引用(Strong/soft/weak/phantom Reference)
- iOS如何在容器类(如NSMutableSet)中使用弱引用(weak reference)
- Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器
- CALC WITHOUT CONTROL 2(惰性计算消除函数循环引用)
- Java 4种引用 strongReference, softReference, weakReference, phantomReference
- 报错:“System.NullReferenceException: 未将对象引用设置到对象的实例”
- [cocos2d-x BUG1]CCLabelBMFont,字符作为child引用会存在错位
- 引用,指针,按值的使用时机
- WeakReference不影响引用计数
- 四种引用类型、ReferenceQueue和WeakHashMap
- 基于HDFS的实时计算和wordcount程序