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 ...
随机推荐
- C# - 委托的使用
代码: using System; namespace Delegate { public class Program { //声明委托 public delegate void DelegatePa ...
- 阻塞队列BlockingQueue用法(转)
多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享. 假设我们有若干生产者线程,另外又有若干个消费者线程.如果生产者线程需 ...
- 拍照图片滤镜sample
本文章主要介绍拍完照片后对图片的渲染进行处理 可以对拍出的照片进行选择不同的滤镜,令在图片上附有编辑框,供大家对图片进行描述,这是一个可以手动拖动的编辑框,在这里主要介绍下,手指放到控件上什么情况下视 ...
- linux安装Tesseract-OCR
安装Tesseract-OCR 1. leptonica 需要源码编译安装http://www.leptonica.org/ leptonica 包: leptonica-1.73.tar.gz 解 ...
- boost锁的概述
● boost锁的概述 boost库中提供了mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁. ▲ mutex对象类 mutex类主要有两种:boost::mutex,b ...
- Android应用开发之(通过ClipboardManager, ClipData进行复制粘贴)
在开发一些系统应用的时候,我们会用到Android的剪贴板功能,比如将文本文件.或者其他格式的内容复制到剪贴板或者从剪贴板获取数据等操作.Android平台中每个常规的应用运行在自己的进程空间中,相对 ...
- 【Demo 0015】位置服务及地图
本章学习要点: 1. 掌握位置相关类(CLLocationManager,MKUserLocation) 基本用法; 2. 掌握地图视图(MKMapView)基本用法; ...
- [置顶] 强大的JQuery
JQuery初识 为了简化JS的开发,一些JS库诞生了,JQuery就是其中的一个.JQuery是一个兼容多浏览器的Javascript框架.是轻量级的JS库.jQuery为用户提供了丰富的文档说明, ...
- AS3开发必须掌握的内容
1.事件机制 2.显示列表 3.垃圾回收 4.常用方法 5.网络通信 6.位图动画 7.渲染机制 8.API结构 9.沙箱机制 10.资源管理 11.内存管理 12.性能优化 13.资源选择 14.安 ...
- APPCAN学习笔记003---原生开发与HTML5技术
APPCAN学习笔记003---原生开发与HTML5技术 技术qq交流群:JavaDream:251572072 1.HTML5的优势: HTML5强悍牢固的骨架 CSS3精致到每一个毛孔的皮 ...