Cocos2d-x内存自动释放机制--透彻篇
首先在架构里面需要明白,如果使用new创建对象的话,我们需要自己释放内存,如果直接用引擎提供的警静态方法,我们可以不做内存管理,引擎自动处理,因为引擎背后有一个自动释放池。通过查看源码可以知道,每个静态方法都会调用autorelease()方法。如果我们需要引擎自动释放一个对象,创建后可以调用该对象的autorelease()(前提是该对象所属类继承自CCObject),该方法会把当前对象放入自动释放池中,每次帧过渡时都会去遍历检查是否可以释放掉该对象的内存。
源码如下:
// 创建一个精灵对象,使用create静态方法
CCSprite * pSprite = CCSprite ::create ( "HelloWorld.png");
//深入进入可以发现create调用了autorelease方法
CCSprite * CCSprite :: create( constchar *pszFileName )
{
CCSprite * pobSprite = new CCSprite ();
if ( pobSprite && pobSprite -> initWithFile( pszFileName ))
{
pobSprite -> autorelease();
return pobSprite;
}
CC_SAFE_DELETE ( pobSprite);
return NULL;
}
C_CBREAK_IF (! pSprite);
//autorelease方法把当前对象加入到了自动释放池中(CCPoolManager)
CCObject * CCObject :: autorelease( void )
{
CCPoolManager :: sharedPoolManager()-> addObject (this );
return this ;
}
//最后会去判断可以释放的时候就release掉,然后场景退出再次调用release
void CCAutoreleasePool:: addObject (CCObject * pObject)
{
m_pManagedObjectArray -> addObject( pObject );
CCAssert ( pObject-> m_uReference > 1 , "reference count should be greater than 1" );
++( pObject-> m_uAutoReleaseCount );
pObject -> release();
}
Cocos2d-x内存自动释放机制--透彻篇的更多相关文章
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.3.垃圾收集器与内存分配策略
1.学习目的 当需要排查各种内存溢出. 内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节. Java内存运行时区域的各个部分,其中程序计数 ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.1.内存区域
1.内存区域 根据<Java虚拟机规范(Java SE 7版)> 的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示. 程序计数器 当前线程所执行的字节码的行号指 ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.5.调优实战
高性能硬件上的程序部署策略 在高性能硬件上部署程序,目前主要有两种方式: 通过64位JDK来使用大内存. -- 缺点:GC停顿时间长 使用若干个32位虚拟机建立逻辑集群来利用硬件资源. -- 思 ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.4.JVM工具
1.概述 工具作用:性能监控与故障处理 工作原理:分析数据 数据包含:运行日志. 异常堆栈. GC日志. 线程快照(threaddump/javacore文件). 堆转储快照(heapdump/hpr ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.2.HotSpot虚拟机对象探秘
对象的创建过程 1.加载类 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载. 解析和初始化过. 如果没有,那必须 ...
- 自动释放池autoreleasepool
自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象.当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如 ...
- js堆栈内存的释放
### JS中的堆栈内存 > 俗称叫做作用域(全局作用域/私有作用域) > - 为js代码提供执行的环境(执行js代码的地方) > - 基本数据类型值是直接存放在栈内存中的 > ...
- iOS内存管理系列之二:自动释放与便捷方法
有时候一个所有者创建一个对象后,会立刻将该对象的指针传递给其它所有者.这时,这个创建者不希望再拥有这个对象,但如果立刻给它发送一个release消息会导致这个对象被立刻释放掉——这样其它所有者还没有来 ...
- OC 内存泄露 自动释放池
花絮:看到下面的代码就想起这么一个调侃: 一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法.提笔思索良久后在纸上写下:Hello world! /********************** ...
随机推荐
- angularjs开发总结
使用AngularJS有差不多一年时间了,前前后后也用了不少库和指令,整理了一下,分成四大类列出.有demo地址的,就直接连接到demo地址,其它的直接链到github托管库中. 图片视频类 angu ...
- union判断CPU是little-endian还是big-endian存储
利用联合体的特殊存储方式,便能检测出来cpu所使用的事big-endian或者是little-endian的存储方式. 1.判断系统是Big liden 或者是little ledin 方法1:in ...
- 一个解析cgi参数的SHELL脚本
http://www.cnblogs.com/mfryf/archive/2012/05/23/2514495.html 测试工作中,经常会涉及到一些要验证服务器对某些cgi接口查询结果返回信息进行解 ...
- 命令行创建AVD
1.命令行创建AVD android create avd -n myAvd -t 8 -b armeabi-v7a -p d:\scard.img -s HVGA 2.删除AVD android d ...
- OC1_数组创建
// // main.m // OC1_数组创建 // // Created by zhangxueming on 15/6/11. // Copyright (c) 2015年 zhangxuemi ...
- javascript form 第22节
<html> <head> <title>Form对象</title> </style> <script type="tex ...
- C++重写与重载、重定义
文章引用自:http://blog.163.com/clevertanglei900@126/blog/static/111352259201102441934870/ 重载overload:是函数名 ...
- 超强的ACM题目类型总结
转:初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ...
- OpenJudge/Poj 1004 Financial Management
1.链接地址: http://poj.org/problem?id=1004 http://bailian.openjudge.cn/practice/1004 2.题目: 总时间限制: 1000ms ...
- 初识IO流之小型资源管理器
初次接触到IO流,根据书本上的知识,加上自己的摸索,发现了一些好玩的事情.(书本上的知识或多或少,有时候不足以解决我们的问题!这时候我们就应该自己去求解!!! 所以我们学习的时候要抱有探索的精神,求知 ...