cocos2d-x学习之自动内存管理
一.自动内存管理
1)概述
C++语言默认是没有提供自动内存管理的。使用者需要自己分配,自己释放。在cocos2d-x里提供了一个自动内存管理的方案。主要是通过CCObject来提供的,用户只要继承了CCObject,就可以通过调用autorelease()来告诉系统进行自动内存管理。
一般用法就是: CCLayer* pLayer = CreateLayer(s_nActionIdx); pLayer->autorelease();
2)自动内存管理的实现
自动内存管理的实现原理大概是:用户设置自动释放功能时,内存管理(CCPoolManager)会自动把这个CCObject对象加入其管理池中。等到一定时机(场景销毁,一帧渲染结束,程序退出等),内存管理会遍历其所管理的每一个对象,逐个调用CCObject的释放函数进行释放。CCObject自己内部设置一个引用系数,增加一个使用就系数加一,释放就系数减一,当系数为0时,才真正进行释放。
如果研究下CCPoolManager,会发现进行真正内存管理的是自动释放池(CCAutoreleasePool),CCPoolManager下面包含有多个CCAutoreleasePool。CCAutoreleasePool提供了addObject,removeObject,clear功能。我开始很疑惑,因为进行内存释放管理,一个CCAutoreleasePool就够了。后来仔细考虑,发现了这个的秘密所在:
CCPoolManager管理多个CCAutoreleasePool,是为了方便确定哪个自动释放池(CCAutoreleasePool)可以进行释放,而不用影响到其他的自动释放池。比如在关卡切换时,上一个关卡的自动释放池的数据就可以进行自动释放了,而新关卡的自动释放池不变~~ 好想法!
二、引用计数器——手动管理内存
- //引用次数+1
- virtual void CCObject::retain(void);
- //引用次数-1;若引用计数器=0,则delete this;
- virtual void CCObject::release(void);
- //helper方法,快速判断当前对象只有唯一引用
- bool CCObject::isSingleRefrence(void);
- //返回引用次数
- unsigned int CCObject::retainCount(void);
- CCObject *obj=new CCObject;
- ...
- obj->release();
- obj->retain();
- ...
- obj->release();
- void CCNode::setGrid(CCGridBase* pGrid)
- {
- CC_SAFE_RETAIN(pGrid);
- CC_SAFE_RELEASE(m_pGrid);
- m_pGrid = pGrid;
- }
相关接口:
- CCObject* CCObject::autorelease(void);
- CCObject *obj=new CCOjbect;
- obj->autorelease();
- ...
- virtual void addChild(CCNode * child);
- virtual void addChild(CCNode * child, int zOrder);
- virtual void addChild(CCNode * child, int zOrder, int tag);
- virtual void removeChild(CCNode* child, bool cleanup);
- void removeChildByTag(int tag, bool cleanup);
- virtual void removeAllChildrenWithCleanup(bool cleanup);
- static CCSprite* spriteWithTexture(CCTexture2D *pTexture);
- static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect);
- static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect, const CCPoint& offset);
- static CCSprite* spriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame);
- static CCSprite* spriteWithSpriteFrameName(const char *pszSpriteFrameName);
- static CCSprite* spriteWithFile(const char *pszFileName);
- static CCSprite* spriteWithFile(const char *pszFileName, const CCRect& rect);
- static CCSprite* spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect);
cocos2d-x学习之自动内存管理的更多相关文章
- JVM自动内存管理学习笔记
对于使用 C.C++ 的程序员来说,在内存管理领域,他们既是拥有最高权力的皇帝又是从事最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任.对于 Java 程 ...
- Xcode 如何设置 自动内存管理 转换为 手动内存管理
建议使用自动内存管理 ARC. 如果不想自动内存管理,可以在build phases 下的compile sources 中找到不想自动管理的.m文件 ,给它加compiler flags 为 -fn ...
- JVM自动内存管理机制--读这篇就GO了
之前看过JVM的相关知识,当时没有留下任何学习成果物,有些遗憾.这次重新复习了下,并通过博客来做下笔记(只能记录一部分,因为写博客真的很花时间),也给其他同行一些知识分享. Java自动内存管理机制包 ...
- linux kernel学习笔记-5内存管理_转
void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...
- 深入理解Java虚拟机(自动内存管理机制)
文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获, ...
- iOS----ARC(自动内存管理)
1.ARC是什么呢,有什么用? ARC是苹果官方推出的帮助我们苹果开发工程师管理内存的一种自动内存管理机制,它的前身是MRC,也就是手动内存管理: 2.ARC的基本原理是什么? ARC是编译器(时)特 ...
- 垃圾回收算法手册:自动内存管理的艺术 BOOK
垃圾回收算法手册:自动内存管理的艺术 2016-03-18 华章计算机 内容简介 PROSPECTUS 本书是自动内存管理领域的里程碑作品,汇集了这个领域里经过50多年的研究沉积下来的最佳实践,包含当 ...
- 【IOS学习基础】内存管理
1.内存几大区域 1> 栈区:局部变量(基本数据类型.指针变量). 2> 堆区:程序运行的过程中动态分配的存储空间(创建的对象). 3> BSS段:没有初始化的全局变量和静态变量. ...
- JVM自动内存管理-Java内存区域与内存溢出异常
摘要: JVM内存的划分,导致内存溢出异常的可能区域. 1. JVM运行时内存区域 JVM在执行Java程序的过程中会把它所管理的内存划分为以下几个区域: 1.1 程序计数器 程序计数器是一块较小的内 ...
随机推荐
- 编写服务说明.thrift文件
1.数据类型 基本类型: bool:布尔值,true 或 false,对应 Java 的 boolean byte:8 位有符号整数,对应 Java 的 byte i16:16 位有符号整数,对应 J ...
- 使用iphone5修剪视频的方法
iphone5有很高的视频拍摄质量,这人很多业余爱好者也加入了视频短片的拍摄当中.在拍摄视频的过程中,为了能够捕捉到精彩瞬间,常常会提前拍摄,并延迟结束拍摄,这样就给视频增加了很多无意义的片段.这时, ...
- linux库文件编写入门(笔记)
linux库文件的编写 作者: laomai地址: http://blog.csdn.net/laomai 本文主要参考了如下资料⑴hcj写的"Linux静态/动态链接库的创建和使用&quo ...
- Android Activity学习笔记(一)
Activity为Android应用的四大组件之一,提供界面来与用户完成交互等操作.其中Activity的生命周期的知识这里做个笔记. Activity的生命周期由以下几个部分组成: 1.onCrea ...
- 无线网WEP的安全测试及防范
650) this.width=650;" border="0" alt="" src="http://img1.51cto.com/att ...
- UVALive 7147 World Cup
https://icpcarchive.ecs.baylor.edu/index.phpoption=com_onlinejudge&Itemid=8&page=show_proble ...
- 闲置的eSATA接口,会影响Windows 7的启动速度
为方便用户连接外置硬盘等设备,很多中高 端主板上都有至少一个eSATA接口.事实上,很多人可能根本就不用eSATA接口,你想过没有,正是这个无所事事的eSATA接口,可能无意中就拖慢了 你的Win ...
- class int
class int(object): """ int(x=0) -> integer int(x, base=10) -> integer Convert a ...
- ASP.NET MVC 4 中Jquery上传插件Uploadify简单使用-版本:3.2.1
1.官网下载开发包:http://www.uploadify.com/download/,选择免费的Flash版本: 2.解压后,需要用到以下几个文件: 需要修改uploadify.css中取消上传按 ...
- 高性能的JavaScript -- 读书笔记
高性能的JavaScript 一. 加载和运行 将脚本放在底部 脚本下载解析执行时,页面已经加载完成并显示在用户面前 成组脚本 减少外部脚本文件数量,整合成一个文件 延迟脚本 动态脚本元素 ...