涉世不深,浅谈理解
一、2.x与3.x根类的区别
在cocos2.x时代的根类是CCObject,在当时几乎所有的类都继承自CCObject。然而在cocos3.x时代的根类是Ref,跟CCObject一样,在3.x中几乎所有的类都是继承自Ref。
二、Ref中的接口分析
在框架中,官方对Ref的解释是Ref is used for reference count management.翻译:Ref类是用来管理引用计数。何为引用计数?
引用计数最初是OC中的对于对象内存管理的一种机制,当对象被创建出来后(new或malloc),该对象的引用计数为1,当对该对象执行retain后(object->retain()),引用计数加1,当对该对象执行release后(object->release()),引用计数减1。当该对象的引用计数为0时,系统调用析构函数,将该对象释放。其实简单理解引用计数,它就是表明有几个人正在使用它,当有人使用(引用计数不为0)保留该对象,当没有人使用(引用计数为0)释放该对象。
接口的声明
接口一:void retain();将Ref对象或继承自Ref的对象的引用计数加1
接口二:void release();将Ref对象或继承自Ref的对象的引用计数减1
接口三: Ref* autorelease();将Ref对象或继承自Ref的对象放入自动释放池中
接口四:unsigned int getReferenceCount() const;返回Ref对象或者继承自Ref对象的引用计数
接口五:Ref()权限为受保护的,所以Ref类不能实例化,需要子类实例化
属性一: unsigned int _referenceCount;Ref对象或者继承自Ref对象的引用计数变量
接口的实现
构造函数:Ref::Ref(): _referenceCount(1)当创建Ref对象后,引用计数初始化为1
接口一:CCASSERT(_referenceCount > 0, "reference count should be greater than 0");
++_referenceCount;引用计数加1
接口二:CCASSERT(_referenceCount > 0, "reference count should be greater than 0");
--_referenceCount;引用计数减1
//注意下段代码
if (_referenceCount == 0)//当引用计数为0
{
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
auto poolManager = PoolManager::getInstance();//或得自动释放池管理对象
//获得当前自动释放池,并判断引用计数为0的该对象是否在该对象池中,如果在输出错误
if (!poolManager->getCurrentPool()->isClearing() && poolManager->isObjectInPools(this))
{
CCASSERT(false, "The reference shouldn't be 0 because it is still in autorelease pool.");
}
接口三:Ref* Ref::autorelease()
{
//将该对象加入到当前的释放池中
PoolManager::getInstance()->getCurrentPool()->addObject(this);
return this;
}
接口四:
unsigned int Ref::getReferenceCount() const
{
return _referenceCount;//获得该对象的引用计数
}
三、Ref的作用
其时Ref的作用很简单,它是为了实现Cocos2d的内存机制,作为类的根类,所有继承自该类的对象,在被创建出来后,都会自动添加一个引用计数,并赋值为1。派生类特定的功能,需要派生类自己去实现。