cocos2dx3.0 removeFromParent和removeAllChildren含义

顾名思义,removeFromParent就是把自己从父亲那里移除,removeAllChildren就是移除自己所有的孩子,这些方法的具体实现都在基类Node里面,通过查看代码也很容易看到怎么实现的。

现在主要看下他们两个的调用顺序

示例代码如下:

比如自定义一个类Layer,

#ifndef _MAINMENU_H1_
#define _MAINMENU_H1_

#include "cocos2d.h"
using namespace cocos2d;
using namespace std;
class Layer1 : public Layer
{
public:
    Layer1();

   virtual ~Layer1();

    bool init();

    virtual bool onTouchBegan(Touch *pTouch, Event *pEvent);
    virtual void onTouchMoved(Touch *pTouch, Event *pEvent);
    virtual void onTouchEnded(Touch *pTouch, Event *pEvent);
    virtual void onTouchCancelled(Touch *pTouch, Event *pEvent);

    string haha;

    CREATE_FUNC(Layer1);

};

#endif
#include "Layer1.h"

Layer1::Layer1()
{

}
Layer1::~Layer1()
{

    printf("析构函数");

}

bool Layer1::init()
{
  // this->setTouchEnabled(true);

    auto listen = EventListenerTouchOneByOne::create();
    listen->onTouchBegan = CC_CALLBACK_2(Layer1::onTouchBegan, this);
    listen->onTouchMoved = CC_CALLBACK_2(Layer1::onTouchMoved, this);
    listen->onTouchEnded = CC_CALLBACK_2(Layer1::onTouchEnded, this);
    listen->onTouchCancelled = CC_CALLBACK_2(Layer1::onTouchCancelled, this);
 //   listen->setSwallowTouches(true);
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listen, this);

    return true;
}

bool Layer1::onTouchBegan(Touch *touch, Event * pEvent)
{
    printf("Layer1 began\n");

    this->removeFromParent();
    this->removeAllChildren();

//    for(int i=0;i<100000;i++){
//        printf("char=%s",haha.c_str());
//    }

    return true;
}

void Layer1::onTouchEnded(Touch *touch, Event * pEvent)
{
     printf("Layer1 end\n");
}

void Layer1::onTouchCancelled(Touch *touch, Event *pEvent)
{
    printf("Layer1 cancel\n");
}

void Layer1::onTouchMoved(Touch *touch, Event *pEvent)
{
    printf("Layer1 Move\n");
}
AppDelegate
   auto scene = Scene::create();
   auto layer1=Layer1::create();
   scene->addChild(layer1);
   director->runWithScene(scene);

当点击界面的时候,会报错,看标红的地方,很容易理解什么原因 removeFromParent之后,Layer1实例已经释放了,在调用就会报错(但是在cocos2d-iphone中,他们的顺序是无关紧要的,都可以正确运行,通过调试得知,当调用RemoveFromPanrent的时候,dealloac没有马上调用,而c++中的析构函数会立即调用,我猜想原因可能就在这里吧),然后把顺序反过来,果然正确执行.

下面再看下一个问题,移除Layer1实例的时候,能否只调用removeFromParent,而不调用removeAllChildren().这个可以通过析构函数来判断,新建一个Layer2的类

#ifndef _MAINMENU_H222_
#define _MAINMENU_H222_

#include "cocos2d.h"
using namespace cocos2d;

class Layer2 : public Layer
{
public:
    Layer2();

   virtual ~Layer2();

    bool init();

    virtual bool onTouchBegan(Touch *pTouch, Event *pEvent);
    virtual void onTouchMoved(Touch *pTouch, Event *pEvent);
    virtual void onTouchEnded(Touch *pTouch, Event *pEvent);
    virtual void onTouchCancelled(Touch *pTouch, Event *pEvent);

    CREATE_FUNC(Layer2);

};

#endif
#include "Layer2.h"

Layer2::Layer2()
{
}

Layer2::~Layer2(){
    printf("Layer2析构函数");
}

bool Layer2::init()
{
    //this->setTouchEnabled(true);

    auto listen = EventListenerTouchOneByOne::create();
    listen->onTouchBegan = CC_CALLBACK_2(Layer2::onTouchBegan, this);
    listen->onTouchMoved = CC_CALLBACK_2(Layer2::onTouchMoved, this);
    listen->onTouchEnded = CC_CALLBACK_2(Layer2::onTouchEnded, this);
    listen->onTouchCancelled = CC_CALLBACK_2(Layer2::onTouchCancelled, this);
   // listen->setSwallowTouches(true);
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listen, this);

    return true;
}

bool Layer2::onTouchBegan(Touch *touch, Event * pEvent)
{
     printf("Layer2 began\n");

    return true;
}

void Layer2::onTouchEnded(Touch *touch, Event * pEvent)
{
     printf("Layer2 end\n");
    // pEvent->stopPropagation();
}

void Layer2::onTouchCancelled(Touch *touch, Event *pEvent)
{
     printf("Layer2 cancel\n");
}

void Layer2::onTouchMoved(Touch *touch, Event *pEvent)
{
    printf("Layer2 Move\n");
    pEvent->stopPropagation();
}

Layer1修改,去掉

this->removeAllChildren();这一行代码

Appdelegate

   auto scene = Scene::create();
      // scene->addChild(MainMenu::create());

    auto layer1=Layer1::create();

    //int fff=layer1->getReferenceCount();

    auto layer2=Layer2::create();
    layer1->addChild(layer2);
    scene->addChild(layer1);
   // layer2->retain();

        // run
        director->runWithScene(scene);

通过运行发现,Layer2会执行析构函数,那么Layer2是在什么位置被删除的呢,通过看removeFromParent的源码发现,并没有发现删除Layer2的代码,

而在removeAllChildren()中很容易发现是

_children.clear();但是removeFromParent中并没有这个代码,最后通过分析找到了地方,原来Layer的基类Node有一个_children的Vector数组,当

Node释放的时候,他的属性_children也会释放,然后这个属性会调用析构函数,在析构函数里面调用了clear()方法,如下代码

/** Destructor */

~Vector<T>()

{

CCLOGINFO("In the destructor of Vector.");

clear();

},

,从而使Layer1的孩子Layer2也释放。

所以分析得知,要移除某个cocos2d类的实例,在保证没有内存泄露的情况下(内存泄露的话,两个方法都调也不行),调用 removeFromParent就可删除自身,无需调用removeAllChildren(),如果两个类都想调用,那么先调用removeAllChildren,在调用removeFromParent。

时间: 2024-10-13 15:42:33

cocos2dx3.0 removeFromParent和removeAllChildren含义的相关文章

Cocos2d-X3.0 刨根问底(七)----- 事件机制Event源码分析

这一章,我们来分析Cocos2d-x 事件机制相关的源码, 根据Cocos2d-x的工程目录,我们可以找到所有关于事件的源码都存在放在下图所示的目录中. 从这个event_dispatcher目录中的文件命名上分析 cocos2d-x与事件相关的类一共有四种, Event, EventListener,EventDispatcher, Touch分别为 事件,事件侦听器,事件分发器,触摸 我们先从Event类开始. 打开CCEvent.h文件 /** * Base class of all ki

cocos2d-x3.0 用CCDictionary写文件

bool CDownLoad_LocalData::WriteToConfigFile( DownLoadLocalData* downdata ){ CCDictionary* pDict = CCDictionary::create(); unsigned int lessonid = downdata->lession_id;char s_lessonid[10];sprintf(s_lessonid,"%d",lessonid); CCString* pValue1 =

Cocos2d-X-3.0 之后的版本的环境搭建

 Cocos2d-X-3.0 之后的版本的环境搭建 由于cocos2d游戏开发引擎更新十分频繁,官方文档同步不够及时和完善.所以不要照着官方文档来照做生成工程. <点击图片就能进入网站> 具体的步骤: 1.获取cocos2d-X的源码v3.6版本 然后解压到随便什么位置,比如这里就放在桌面上,文件名cocos2d-x-3.6 2.使用5.1以上版本的XCode 3.将cocos2d-x-3.6中的setup.py直接拖到刚刚打开的终端,然后回车. 然后提示需要做一些环境变量的配置,第一个提示安

Cocos2d-x3.0 Json解析

在Cocos2dx3.0下,JSON解析库官方已经集成好了.我们引用就OK. JSON文件hello.json内容 {"pets":["dog","cat"],"stuInfo":{"stuAge":"23","stuName":"zhangsan","birthday":"1990-01-12"},&quo

cocos2d-x-3.0 build不成功

windows上面建立工程,一开始新宿舍没联网,老是不能成功以下内容: cocos run -p TestAndroid -j 4 一直build failed.内容大致是ant里面build文件284句出了问题~~ 过了会儿来一个有wifi的地方,刚想看看是什么错误,结果以上那句直接就可以通过了....究竟是怎么回事呢?不太清楚~~ cocos2d-x-3.0 build不成功,布布扣,bubuko.com

c++ 基础学习: 左值 概念cocos2d-x3.0的实际应用

左值:概念baidu 1.2.6.2 与Cocos2d-x内存管理的结合 在2.x的使用场景中,CCArray和CCDictionary通常被分配在堆上,我们不得不需要考虑在适当的地方释放其内存.新的容器类不再继承自Ref(2.x中的CCObject),新的容器类通常应该被分配在栈上来使用,这简化了内存管理,我们应该将精力放在容器元素而不是容器本身的内存管理上. Vector中的T和Map<K,V>中的V必须是Ref类型,因为它们需要结合Cocos2d-x的内存管理方式一起工作.这简化了容器中

Cocos2d-x3.0 解压zip

2dx3.0为我们集成了unzip库,帮助我们实现对文件的解压,但使用起来略显复杂我这里封装了一个解压工具库.分享一下. 工具类下载:http://download.csdn.net/detail/qqmcy/7288151 先引入头文件 #include "DJZipArchive.h" 实现解压代码 //获取文件路径 const char* file_path = FileUtils::getInstance()->fullPathForFilename("hell

cocos2d-x3.0 ListView

.h #include "cocos2d.h" #include "cocos-ext.h" #include "ui/CocosGUI.h" #include "cocostudio/CocoStudio.h" USING_NS_CC; USING_NS_CC_EXT; using namespace ui; void selectedItemEvent(Ref *pSender, ListViewEventType typ

cocos2dx3.0 打飞机

cocos2dx3.0 + vs2013 简单打飞机游戏 本文地址:http://blog.csdn.net/qq_26437925/article/details/52059069 游戏资源,借用了微信打飞机的图库 初版源码地址:https://github.com/doctording/cocos2dx_plane_cpp 滚动背景问题: 持续按键,执行动作 例如:需要移动时,若一直按着A键,那么飞机将一直往左移动 解决方案: 设置一个变量,标识A键是否被按下,在update()方法中执行左