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;//自己主动释放池的名字

};

时间: 2024-12-24 08:45:28

cocos2D-x 3.5 引擎解析之--引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)的相关文章

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();//减少引用计数一次,

(20)Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)

引用计数 引用计数是c/c++项目中一种古老的内存管理方式.当我8年前在研究一款名叫TCPMP的开源项目的时候,引用计数就已经有了. iOS SDK把这项计数封装到了NSAutoreleasePool中.所以我们也在Cocos2d-x中克隆了一套CCAutoreleasePool.两者的用法基本上一样,所以假如你没有涉及过ios开发,你可以看看苹果官方文档NSAutoreleasePool Class Reference. CCAutoreleasePool Cocos2d-x的CCAutore

引用计数

在引用计数中,每一个对象负责维护对象所有引用的计数值.当一个新的引用指向对象时,引用计数器就递增,当去掉一个引用时,引用计数就递减.当引用计数到零时,该对象就将释放占有的资源.中文名引用计数原 因程序调试原 理每一个对象负责维护对象所有引用的计数值类 型最直观的垃圾收集策略目录1简介2引用计数的使用? 原因? 规则? 接口? 调试? 优化? 规则1简介编辑 最直观的垃圾收集策略是引用计数.引用计数很简单,但是需要编译器的重要配合,并且增加了赋值函数 (mutator) 的开销(这个术语是针对用户

Objective-C内存管理之引用计数

初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存管理这一部分说的非常简单,只有三条准则: 当你使用new.alloc或copy方法创建一个对象时,该对象的保留指针为1,当不再使用该对象的时候,你应该想该对象发送一条release或autorelease消息,这样,该对象在其寿命结束时将被销毁. 当你通过其他方法获得一个对象时,假设该对象的保留计数

swift内存管理中的引用计数

在swift中,每一个对象都有生命周期,当生命周期结束会调用deinit()函数进行释放内存空间. 观察这一段代码: class Person{ var name: String var pet: Pet? init(name: String){ self.name = name print("Person", name, "is initialized") } init(name: String, petName: String){ self.name = nam

OC基础15:内存管理和自动引用计数

1.什么是ARC? (1).ARC全名为Automatic Reference Counting,即是自动引用计数,会自动统计内存中对象的引用数,并在适当时候自动释放对象: (2).在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不用写retain. release和autorelease三个关键字: (3).在使用ARC之前,需要手动管理内存计数,这种机制称为MRC,即是手动引用计数 (Manual Referecen Counting): (4).ARC是Objective-

Objective-C 引用计数:不讲用法,只说原理

本文所使用的源码为 objc4-647 和 CF-1153.18 实际上这是我本周实习周报的一部分,写的比较仓促,如有差错还请多多指正. 不讲用法,只说原理. 引用计数如何存储 有些对象如果支持使用 TaggedPointer,苹果会直接将其指针值作为引用计数返回:如果当前设备是 64 位环境并且使用 Objective-C 2.0,那么“一些”对象会使用其 isa 指针的一部分空间来存储它的引用计数:否则 Runtime 会使用一张散列表来管理引用计数. 其实还有一种情况会改变引用计数的存储策

COM对象除了引用计数还有...

COM对象除了引用计数还有… 一.   背景: VideoManager支持实时, 需要同时传入一组窗口的设备信息和StreamerID, 并且传入之后需要设置给相对应的VideoView. 所以在VideoManager实现了IDeviceInfo的COM对象, 包含三个成员分别是IVideoView* video_view, GUID streamer_id, IDeviceConfig* device_config. C#的调用如下 var list_deviceInfo = new Li

Cocos2d之&ldquo;引用计数&rdquo;内存管理机制实现解析

一.引言 本文主要分析cocos2d游戏开发引擎的引用计数内存管理技术的实现原理.建议读者在阅读本文之前阅读笔者之前一篇介绍如何使用cocos2d内存管理技术的文章--<Cocos2d之Ref类与内存管理使用详解>. 二.相关概念 引用计数 引用计数是计算机编程语言的一种内存管理技术,是指将资源(对象.内存或者磁盘空间等)的被引用计数保存起来,当引用计数变为零时就将资源释放的过程.使用引用计数技术可以实现自动内存管理的目的. 当实例化一个类时,对象的引用计数为1,在其他对象需要持有这个对象时,