Cocos2d-3.X--分析Ref类

来源:互联网 发布:达拉然火焰卡背淘宝 编辑:程序博客网 时间:2024/06/05 04:35

涉世不深,浅谈理解

一、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。派生类特定的功能,需要派生类自己去实现。