看了引用计数之后  那时好像懂了   今天突然想起一个问题:

Scene也是继承自Ref 。然后也是静态生成一个autorelease后的对象  那计数就变成1了
class CC_DLL Scene : public Node
{
public:
    /** creates a new Scene object */
    static Scene *create();
{
Scene *Scene::create()
{
    Scene *ret = new Scene();
    if (ret && ret->init())
    {
        ret->autorelease();
        return ret;
    }
    else
    {
        CC_SAFE_DELETE(ret);
        return nullptr ;
    }
}
}
}

main函数里面: 【每种颜色代表一个函数  颜色嵌套代表函数的调用 类似栈】
int APIENTRY _tWinMain (HINSTANCE hInstance ,
                       HINSTANCE hPrevInstance ,
                       LPTSTR    lpCmdLine ,
                       int       nCmdShow)
{
    return Application::getInstance()->run();
          当中run(){
          while(!glview->windowShouldClose())
           {
             QueryPerformanceCounter(&nNow);
              if (nNow.QuadPart - nLast.QuadPart
> _animationInterval.QuadPart)
             {
                 nLast.QuadPart = nNow.QuadPart;
           
                 director->mainLoop();
                  当中mainLoop();
                    {
                       drawScene();
                       PoolManager::getInstance()->getCurrentPool()->clear();
                                        for (const auto &obj
: _managedObjectArray)
     {
        obj->release();
     }
                     }
                 glview->pollEvents();
             }
              else
             {
                 Sleep(0);
             }
         }
         }
}

我们看到蓝色代码那里,PoolManager::getInstance()->getCurrentPool()->clear();
这句代码会调用obj->release();把每一个增加autoreleasepool的对象进行release操作,好了问题就来了(不是挖掘面积)
Scene增加autorelease了  node继承的都增加了   Sprite也增加了  我们知道ref的构造函数是把引用计数自己主动变成1。那这里每一帧的绘画会把对象池里面的scene node sprite调用一次release 假设没有其它retain也就是变成0要回收了。可是不是这种,实际还是能够显示出来的
有两个地方  一个是scene的runWithScene一个是继承node的sprite这些等等

1、scene的runWithScene
【每种颜色代表一个函数  颜色嵌套代表函数的调用 类似栈】
bool AppDelegate ::applicationDidFinishLaunching() {
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLView::create("WeChat
Airplane" );
            glview->setFrameSize(600,800);
        director->setOpenGLView(glview);
    }
    director->setDisplayStats( true);
    director->setAnimationInterval(1.0 / 60);
    glview->setDesignResolutionSize(480, 800, ResolutionPolicy::SHOW_ALL );
    this->setResourceSearchResolution();
    auto scene = WelcomeScene::create();
    director->runWithScene(scene);
     runWithScene(scene){
          pushScene( scene);
          {
               _scenesStack.pushBack( scene);
               {
                    _data.push_back( object );
                    object ->retain();
               }
          }
     }
    return true;
}

从上面的代码  我们能够看到不妨retain了   所以scene是在mainloop里面的autoreleasepool减1  clear一次 可是他在_scenesStack retain了
那么就不会被回收了  那全部的node事实上都是加入到scene里面的。也就不会由于release Scene而导致node减1

2、继承node的sprite这些等等
我们知道都要addChild的  layer也好 node也好 sprite也好  都是要加进去的
void Node::addChild(Node *child)
{
    CCASSERT( child != nullptr , "Argument
must be non-nil" );
    this->addChild(child, child->_localZOrder, child->_tag);
     {
          void Node ::insertChild( Node* child, int z)
{
    _transformUpdated = true ;
    _reorderChildDirty =true;
    _children.pushBack(child);

     void pushBack(T object )
    {
        CCASSERT (object != nullptr , "The
object should not be nullptr" );
        _data.push_back( object );
        object ->retain();
    }
   child->_setLocalZOrder( z);
}
     }
}

从上面的调用来看  我们能够看到最后的调用还是用了object ->retain();
 所以mainloop里面autoreleasepool 调用release是把2变成1  然后autoreleasepool 已经把vector存的内容clear下一帧就不会调用了

【cocos2d-x-3.1.1系列5】cocos2d-x 引用计数细节的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  2. 【C++自我精讲】基础系列一 指针与引用

    [C++自我精讲]基础系列一 指针与引用   一 前言   指针.引用.指针与引用区别. 二 指针   变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间. //变量 ...

  3. 【Cocos2d实例教程一】xcode5下Cocos2d环境的搭建

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 第一步,现在要安装集成环境xcode5,安装xcode5需要系统至少是os x 10.8.5. 第二步,下载co ...

  4. 【58沈剑架构系列】RPC-client异步收发核心细节?

    第一章聊了[“为什么要进行服务化,服务化究竟解决什么问题”] 第二章聊了[“微服务的服务粒度选型”] 第三章聊了[“为什么说要搞定微服务架构,先搞定RPC框架?”] 上一章聊了[“微服务架构之RPC- ...

  5. Mybatis源码详解系列(四)--你不知道的Mybatis用法和细节

    简介 这是 Mybatis 系列博客的第四篇,我本来打算详细讲解 mybatis 的配置.映射器.动态 sql 等,但Mybatis官方中文文档对这部分内容的介绍已经足够详细了,有需要的可以直接参考. ...

  6. iOS内存管理系列之一:对象所有权与引用计数

    当一个所有者(owner,其本身可以是任何一个Objective-C对象)做了以下某个动作时,它拥有对一个对象的所有权(ownership): 1. 创建一个对象.包括使用任何名称中包含“alloc” ...

  7. webForm系列 前端框架快速引用

    Html的确定就是不能重用,MVC可以在_Layout.cshtml中将每个页面都需要的js和css文件(如jq,bootstrap等)都引用进去,webform就麻烦一点. webForm需要给所以 ...

  8. 学习React系列(六)——更新dom细节于原理

    React更新dom的依据: 1.不同类型的elements会产生不同的树 2.通过render方法中包含key属性的子元素,开发者可以示意哪些子元素可能是稳定的. 更新过程: 一.根元素类型不同:旧 ...

  9. Java系列:使用软引用构建敏感数据的缓存

    一.为什么需要使用软引用    首先,我们看一个雇员信息查询系统的实例.我们将使用一个Java语言实现的雇员信息查询系统查询存储在磁盘文件或者数据库中的雇员人事档案信息.作为一个用户,我们完全有可能需 ...

随机推荐

  1. Angular——自定义过滤器

    基本介绍 除了使用AngularJS内建过滤器外,还可以根业务需要自定义过滤器,通过模块对象实例提供的filter方法自定义过滤器. 基本使用 (1)input是将绑定的数据以参数的形式传入 (2)i ...

  2. IDEA中springboot项目打包成jar

      springboot的打包方式有很多种.有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的.这里主要介绍如何打成jar进行部署.不推荐用war,因为spri ...

  3. vue-cli中圣杯布局失效问题

    众所周知vue2在前端框架越来越流行,vue-cli这个脚手架工具是我们前端开发必用的,大大的提升了我们的开发效率.当然对于前端小白来说,有些遇到的问题需要和大家分享一下. 移动端页面经常都是需要圣杯 ...

  4. 「 HDU P2089 」 不要62

    和 HDOJ 3555 一样啊,只不过需要多判断个 ‘4’ 我有写 3555 直接去看那篇吧 这里只放代码 #include <iostream> #include <cstring ...

  5. HDU - 6266 - HDU 6266 Hakase and Nano (博弈论)

    题意: 有两个人从N个石子堆中拿石子,其中一个人可以拿两次,第二个人只能拿一次.最后拿完的人胜利. 思路: 类型 Hakase先 Hakase后 1 W L 1 1 W W 1 1 1 (3n) L ...

  6. Humidex POJ - 3299 (数学)

    题目大意 给定你三个变量中的两个输出剩下的那一个 题解 没有什么,就是把公式推出来即可,完全的数学题 代码 #include <iostream> #include <cmath&g ...

  7. 如何防止XshellPortable、putty、SecureCRT等断网造成Linux命令中断

    在使用XshellPortable.putty.SecureCRT等工具远程连接Linux系统时,如果我们执行了一大堆命令,在命令尚未执行完毕,客户端突然断网或者XshellPortable.putt ...

  8. CentOS7 安装 PHP7.2

    点击查看原文 安装源 安装 EPEL 软件包: $ sudo yum install epel-release 安装 remi 源: $ sudo yum install http://rpms.re ...

  9. gitlab root 账号 忘记密码如何重置

    shell>cd /home/git/gitlabshell> su gitshell>bundle exec rails console productionirb(main):0 ...

  10. Django DTL模板语法中的循环

    from django.shortcuts import render def index(request): context={ 'books':[ '5年高考3年模拟', '家猪养殖与配种', ' ...