cocos2D-x 3.5 引擎解析之--引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)
#include <CCRef.h>
Ref is used for reference count manangement. If a classinherits from Ref.
Class Ref 为引用计数类,用来管理对象的引用计数。
这样就不会出现还有指针保持指向该对象,当使用该指针操作时,假设指向的对象被销毁就会出现程序异常。
class
CC_DLL Ref
{
public:
void
retain();//添加引用计数一次
void
release();//降低引用计数一次,假设此时引用计数为零,使用AutoreleasePoolManager释放内存
Ref*
autorelease();//把当前对象增加到自己主动释放池中。使之成为一个可使用引用计数的对象
比如:
PhysicsBody*
PhysicsBody::create()
{
PhysicsBody*
body = new (std::nothrow)
PhysicsBody();
if (body &&
body->init())
{
body->autorelease();//此处使用autorelease把body增加到自己主动释放池,就能够使body成为一个能够被引用计数的对象
return body;
}
CC_SAFE_DELETE(body);
return
nullptr;
}
unsigned
int getReferenceCount()
const;//返回引用计数值
protected:
Ref();//初始化引用计数为1
public:
virtual ~Ref();
protected:
unsigned
int _referenceCount;//引用计数
friend
class AutoreleasePool//自己主动释放池友元类
};
PoolManager为资源池管理器。管理着一个自己主动释放池的vector。採用的是单例模式设计的。也就是说仅仅同意一个PoolManager对象。
#include <CCAutoreleasePool.h>
class
CC_DLL PoolManager
{
public:
CC_DEPRECATED_ATTRIBUTE
static PoolManager*
sharedPoolManager() {
return getInstance(); }//static 方法返回单例对象的指针
static
PoolManager* getInstance();//使用该函数返回一个单例对象的指针,此处会检查s_singleInstance是否为空,为空就new一个PoolManager对象
CC_DEPRECATED_ATTRIBUTE
static void
purgePoolManager() { destroyInstance(); }//析构PoolManager指针
static
void destroyInstance();
AutoreleasePool *getCurrentPool()
const;//返回vector中最后一个自己主动释放池对象
bool
isObjectInPools(Ref* obj)
const;//检查自己主动释放池中是否有obj对象
friend
class AutoreleasePool;//设置自己主动释放池为友元类
private:
PoolManager();//构造函数。初始化vector能够包括十个自己主动释放池
~PoolManager();
void
push(AutoreleasePool *pool);//把pool从back增加到vector
void
pop();//弹出vector中back元素
static
PoolManager* s_singleInstance;//单例对象指针,设置为私有元素
std::vector<AutoreleasePool*>
_releasePoolStack;//该类管理的自己主动释放池vector
};
自己主动释放池管理着一个引用计数对象的vector,而且每一个自己主动释放池有自己的名字
#include <CCAutoreleasePool.h>
class
CC_DLL AutoreleasePool
{
public:
AutoreleasePool();//构造函数,初始化自己主动释放池名字为空,vector容量为150
AutoreleasePool(const
std::string &name); //构造函数,初始化自己主动释放池名字为name,vector容量为150
~AutoreleasePool();//析构函数
void
addObject(Ref *object);//把object对象从back增加到vector中
void
clear();//清空vector
bool
contains(Ref* object)
const;//检查vector中是否含有object对象
void
dump();
private:
std::vector<Ref*>
_managedObjectArray;//vector对象
std::string
_name;//自己主动释放池的名字
};
cocos2D-x 3.5 引擎解析之--引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)的更多相关文章
- iOS内存管理机制解析之MRC手动引用计数机制
前言: iOS的内存管理机制ARC和MRC是程序猿參加面试基本必问的问题,也是考察一个iOS基本功是 否扎实的关键,这样深入理解内存管理机制的重要性就不言而喻了. iOS内存管理机制发展史 iOS 5 ...
- (20)Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
引用计数 引用计数是c/c++项目中一种古老的内存管理方式.当我8年前在研究一款名叫TCPMP的开源项目的时候,引用计数就已经有了. iOS SDK把这项计数封装到了NSAutoreleasePool ...
- Objective-C内存管理之引用计数
初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...
- Objective-C 引用计数:不讲用法,只说原理
本文所使用的源码为 objc4-647 和 CF-1153.18 实际上这是我本周实习周报的一部分,写的比较仓促,如有差错还请多多指正. 不讲用法,只说原理. 引用计数如何存储 有些对象如果支持使用 ...
- OC基础15:内存管理和自动引用计数
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...
- 自动引用计数(ARC)
1.1什么是自动引用技术 顾名思义,自动引用计数(ARC, Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术.以下摘自苹果官方说明: 在Objectiv ...
- swift内存管理中的引用计数
在swift中,每一个对象都有生命周期,当生命周期结束会调用deinit()函数进行释放内存空间. 观察这一段代码: class Person{ var name: String var pet: P ...
- 恒生UFX接口引用计数心得
本文介绍在基于恒生T2SDK基础上开发对接UFX柜台时,有关引用计数的一些心得体会. 下面以配置接口和连接接口为例子来介绍,下面是文档介绍: 创建配置接口说明: 3.1.2 创建配置接口(NewCon ...
- Swift ARC 自动引用计数
1.ARC 引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0 ...
随机推荐
- ASP.NET - 多文件上传,纯代码,不使用插件
解决方案: 前段代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Mu ...
- VC++ WIN32 sdk实现按钮自绘详解 之二(关键是BS_OWNERDRAW和WM_DRAWITEM)
网上找了很多,可只是给出代码,没有详细解释,不便初学者理解.我就抄回冷饭.把这个再拿出来说说. 实例图片: 首先建立一个标准的Win32 Application 工程.选择a simple Wi ...
- 【ASP.NET Web API教程】2.3.6 创建产品和订单控制器
原文:[ASP.NET Web API教程]2.3.6 创建产品和订单控制器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 6 ...
- 基于Hadoop技术实现的离线电商分析平台(Flume、Hadoop、Hbase、SpringMVC、highcharts)
离线数据分析平台是一种利用hadoop集群开发工具的一种方式,主要作用是帮助公司对网站的应用有一个比较好的了解.尤其是在电商.旅游.银行.证券.游戏等领域有非常广泛,因为这些领域对数据和用户的特性把握 ...
- BCB/Delphi中常用的VCL函数说明(字符串函数)
本文档是ccrun(老妖)根据网上资料整理而成. --------------------内存分配--------------------函数名称:AllocMem函数说明:在队中分配指定字节的内存块 ...
- centos7 opera济览器安装
网网下rpm安装包: http://www.opera.com/computer/thanks?partner=www&par=id%3D39136%26amp;location%3D403& ...
- Java调用cmd命令 打开一个站点
使用Java程序打开一个站点 近期做了个东西使用SWT技术在一个client程序 须要升级时在提示升级 点击窗口上的一个连接 打开下载网页 花费了我非常长时间 用到了把它记录下来 怕是忘记,须要时能 ...
- flashcache中应用device mapper机制
Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备. DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射” ...
- Python的对象和类型
Python使用对象来存储数据,构造任何类型的值都是一个对象. 任何一个对象都有三个特性:身份,类型和值. 身份是对象的唯一标识,可以通过内建函数id()得到,这个值可以认为是该对象的内存地址. Py ...
- Linux $( )与${ }的区别
初学者也许会遇到这个问题~ $( )的用途和反引号` `一样,用来表示优先执行的命令,比如ls -l $(locate build.xml),表示先找到build.xml的位置,然后再列出详细信息. ...