Cocos2d之Ref类与内存管理使用详解
一、简介
用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类与内存管理使用详解相关推荐
- Unreal3 window下内存管理实现详解
Unreal3 window下内存管理实现详解 最近组里面同事加入了一个很牛叉的内存管理代码,勾起我对内存管理的强烈欲望,以前也做过内存管理,在没有遇到U3以前看了3,4种算法(C++游戏编程 这本书 ...
- Android内存管理机制详解,【安卓知识普及贴】之关于安卓内存管理机制的一些介绍和阐述。...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 安卓系统其实不需要极度精简,只是一味的精简并不会给系统带来什么好处反而只有害处,因为许多系统应用跟设置里的选项有关联,删除掉就会在选择关联选项的时候FC, ...
- ARC内存管理机制详解
ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting-自动引用计数.有自 ...
- JVM的内存管理机制详解
一.为什么要学习内存管理? Java与C++之间有一堵由内存动态分配和垃圾回收机制所围成的高墙,墙外面的人想进去,墙里面的人出不来 对于Java程序员来说,JVM给我们提供了自动内存管理机制,不需要既 ...
- C语言内存管理超详解
补充: 1.一个正在运行着的C编译程序占用的内存分为栈区.堆区.未初始化数据区(BBS).初始化数据区.代码区5个部分. (1)栈区:存放函数的参数值.局部变量的值.由编译器自动分配释放. (2)堆区 ...
- 操作系统:第三章 内存管理2 - 详解虚拟内存,页面置换算法,页面分配策略
本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必 ...
- Oracle内存管理PGA详解
当用户进程连接到数据库并创建一个对应的会话时,Oracle服务进程会为这个用户专门设置一个PGA区,用来存储这个用户会话的相关内容.当这个用户会话终止时,系统会自动释放这个PGA区所占用的内存.这个P ...
- MMU内存管理单元详解
MMU 诞生之前: 在传统的批处理系统如 DOS 系统,应用程序与操作系统在内存中的布局大致如下图: 应用程序直接访问物理内存,操作系统占用一部分内存区. 操作系统的职责是"加载" ...
- linux占内存小的浏览器,基于μCLinux嵌入式操作系统上的浏览器内存管理策略研究详解...
0 引言 在嵌入式系统中,由于设备性能限制系统总的可分配内存相对较小,而在嵌入式平台上浏览器正常运行所需内存一般都比较大,并且内存分配和释放操作也比较频繁,例如,IPTV EPG界面上显示各类菜单按钮 ...
最新文章
- C#程序设计笔记(第九章)
- Mysql 的源码包安装
- 最小化安装时没有ifconfig命令,没有firewalld.service
- PayPal 开发详解(六):下载paypal立即付款SDK 并编译打包
- C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数
- mysql root用户创建数据库,分配到一个帐户下
- 微软自带iscsi客户端对iqn的要求
- 使用单项循环链表实现字典操作(算法导论第十章10.2-5题)
- 解读Laravel,看PHP如何实现Facade?
- shell脚本中常见的几个判断
- top命令的使用查看进程占用
- 建立自己的JS库【初始篇】
- 你画我猜游戏html源代码,微信小程序你画我猜demo完整源码
- Android 继承于PopuWindow的自定义弹出窗体
- Structure of a Google Docs document 谷歌文档的结构
- 百度网盘网页端视频倍速方法
- 利用WorkBook实现excel到list的转换
- vc中 volatile 的作用
- 如何使用.bas文件
- opencv光线补偿_精准光线曝光补偿和包围曝光的运用