一、简介

用C++和JAVA编写过程序的朋友一定会为两种语言不同的内存管理机制懊恼。JAVA程序运行在JVM之上,由JVM自动实现内存管理,开发者只管申请内存而不用手动释放内存。当JAVA中对象没有被任何引用变量(类似于C和C++的指针)引用时,JVM会将对象释放掉。C++和C一样,是编译后能够直接被操作系统执行的语言,没有虚拟机负责其内存管理,因此需要在程序中管理内存。本文主要介绍如何使用cocos2d提供的内存管理机制。

Cocos2d-x借鉴了“引用计数”思想,实现了一定程度上的自动内存管理。cocos2d委托对象管理池PoolManager存放对象和释放对象资源,管理池释放对象的判据是对象的引用计数为0。

二、Ref类

Ref类实现了与cocos2d内存管理机制交互的接口,所有Ref的子类对象的内存能够被管理池自动管理。Ref类的接口如下:

//
// 该方法能够增加Ref对象的引用计数
void retain();/
// 减少 Ref 对象的引用计数,
// 如果计数减少到0,则对象被释放
void release();// 没有立即减少引用计数,
// 而是在结束当前pool池时,减少Ref对象的引用计数
// 如果计数减少到0,则对象被释放
void autorelease();

当实例化一个Ref类的子类时,调用该对象的retain方法能够使计数加1。下面看一下常用的Ref子类Scene类的create方法的实现原理:

Scene* Scene::create()
{Scene *ret = new (std::nothrow) Scene();if (ret && ret->init()){ret->autorelease();return ret;}else{CC_SAFE_DELETE(ret);return nullptr;}
}

实例化Scene类后,立即调用autorelease方法,如果返回的ret被其它地方使用(也就是调用对象的retain方法使引用计数加1),那么在本次pool池结束后对象不会被销毁;如果返回的ret没有被使用,那么本次poo池结束后对象被销毁以防止内存溢出。

// 返回的ret被addChild方法使用
// addChild内部会调用ret的retain方法使引用计数加1
// 本次pool池结束后ret指向对象不会被释放
this->addChild(Scene::create());    // create返回ret指针

再举一些例子。

///
// __Array是Ref的子类
// 必须显式调用retain方法,否则count方法出错
// 因为array引用计数为0,pool结束后将其释放
auto array = __Array::create();
array.retain();
....
array.count();  // 在上次pool结束后,比如按键回调中使用

///
// addObject方法能够显式调用sprite.retain(),
// 所以对象不会被释放
Sprite *sprite = Sprite::create();
array.addObject(sprite);
....
Sprite *sp = (Sprite*) array.getLastObject(); // 在上次pool结束后,比如按键回调中使用

下面总结一下cocos2d管理内存的一些规则

  • 在使用Node节点对象的时候,addChild()方法能够隐式调用被添加节点的retain方法,removeChild()方法能够调用被移除对象的release方法。
  • 如果是__Array和__Dictionary等由coco2d的类,它们本身是Ref的子类,它们添加或者删除元素时能够相应地隐式调用retain和release方法。但前提是,__Array和__Dictionary的对象需要被retain以保证不被释放掉。
  • 如果不是上述的Ref子类对象,需要显式并且成对地调用retain和release方法。

转载于:https://www.cnblogs.com/chenshi/p/4082805.html

Cocos2d之Ref类与内存管理使用详解相关推荐

  1. Unreal3 window下内存管理实现详解

    Unreal3 window下内存管理实现详解 最近组里面同事加入了一个很牛叉的内存管理代码,勾起我对内存管理的强烈欲望,以前也做过内存管理,在没有遇到U3以前看了3,4种算法(C++游戏编程 这本书 ...

  2. Android内存管理机制详解,【安卓知识普及贴】之关于安卓内存管理机制的一些介绍和阐述。...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 安卓系统其实不需要极度精简,只是一味的精简并不会给系统带来什么好处反而只有害处,因为许多系统应用跟设置里的选项有关联,删除掉就会在选择关联选项的时候FC, ...

  3. ARC内存管理机制详解

    ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting-自动引用计数.有自 ...

  4. JVM的内存管理机制详解

    一.为什么要学习内存管理? Java与C++之间有一堵由内存动态分配和垃圾回收机制所围成的高墙,墙外面的人想进去,墙里面的人出不来 对于Java程序员来说,JVM给我们提供了自动内存管理机制,不需要既 ...

  5. C语言内存管理超详解

    补充: 1.一个正在运行着的C编译程序占用的内存分为栈区.堆区.未初始化数据区(BBS).初始化数据区.代码区5个部分. (1)栈区:存放函数的参数值.局部变量的值.由编译器自动分配释放. (2)堆区 ...

  6. 操作系统:第三章 内存管理2 - 详解虚拟内存,页面置换算法,页面分配策略

    本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必 ...

  7. Oracle内存管理PGA详解

    当用户进程连接到数据库并创建一个对应的会话时,Oracle服务进程会为这个用户专门设置一个PGA区,用来存储这个用户会话的相关内容.当这个用户会话终止时,系统会自动释放这个PGA区所占用的内存.这个P ...

  8. MMU内存管理单元详解

    MMU 诞生之前: 在传统的批处理系统如 DOS 系统,应用程序与操作系统在内存中的布局大致如下图: 应用程序直接访问物理内存,操作系统占用一部分内存区. 操作系统的职责是"加载" ...

  9. linux占内存小的浏览器,基于μCLinux嵌入式操作系统上的浏览器内存管理策略研究详解...

    0 引言 在嵌入式系统中,由于设备性能限制系统总的可分配内存相对较小,而在嵌入式平台上浏览器正常运行所需内存一般都比较大,并且内存分配和释放操作也比较频繁,例如,IPTV EPG界面上显示各类菜单按钮 ...

最新文章

  1. C#程序设计笔记(第九章)
  2. Mysql 的源码包安装
  3. 最小化安装时没有ifconfig命令,没有firewalld.service
  4. PayPal 开发详解(六):下载paypal立即付款SDK 并编译打包
  5. C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数
  6. mysql root用户创建数据库,分配到一个帐户下
  7. 微软自带iscsi客户端对iqn的要求
  8. 使用单项循环链表实现字典操作(算法导论第十章10.2-5题)
  9. 解读Laravel,看PHP如何实现Facade?
  10. shell脚本中常见的几个判断
  11. top命令的使用查看进程占用
  12. 建立自己的JS库【初始篇】
  13. 你画我猜游戏html源代码,微信小程序你画我猜demo完整源码
  14. Android 继承于PopuWindow的自定义弹出窗体
  15. Structure of a Google Docs document 谷歌文档的结构
  16. 百度网盘网页端视频倍速方法
  17. 利用WorkBook实现excel到list的转换
  18. vc中 volatile 的作用
  19. 如何使用.bas文件
  20. opencv光线补偿_精准光线曝光补偿和包围曝光的运用

热门文章

  1. WebLogic配置JNDI数据源
  2. 前端知识 — HTML内容、CSS基础
  3. 《流量的秘密 Google Analytics网站分析与商业实战》一2.2 版本选择的标准
  4. cookie 以及session 的使用
  5. CCNA认证(2)--网络互联基础
  6. CRC冗余校验码的介绍和实现
  7. FLUSH TABLES WITH READ LOCK有多快
  8. vs2003 打开VS.NET项目时遇到 “无法从web服务器获取项目文件” 解决方案
  9. Golang sort 排序
  10. Linux 后台开发常用命令目录(更新 ing)