zoukankan      html  css  js  c++  java
  • cocos2dx进阶学习之CCObject

    继承关系

    CCObject -> CCCopying


    类定义

    class CC_DLL CCObject : public CCCopying
    {
    public:
        // object id, CCScriptSupport need public m_uID
        unsigned int        m_uID;
        // Lua reference id
        int                 m_nLuaID;
    protected:
        // count of references
        unsigned int        m_uReference;
        // count of autorelease
        unsigned int        m_uAutoReleaseCount;
    public:
        CCObject(void);
        /**
         *  @lua NA
         */
        virtual ~CCObject(void);
        
        void release(void);
        void retain(void);
        CCObject* autorelease(void);
        CCObject* copy(void);
        bool isSingleReference(void) const;
        unsigned int retainCount(void) const;
        virtual bool isEqual(const CCObject* pObject);
    
        virtual void acceptVisitor(CCDataVisitor &visitor);
    
        virtual void update(float dt) {CC_UNUSED_PARAM(dt);};
        
        friend class CCAutoreleasePool;
    };

    成员解释

    变量

    unsigned int m_uID;

    对象ID,由CCObject管理的全局唯一对象ID,用于CCScriptSupport类。每生成一个CCObject或者其子类对象,id自动增长1。


    int m_nLuaID;

    LuaID,从名字上看就知道是Lua脚本使用的ID,该ID由CCObject定义,但是CCObject并不管理该ID,由LuaCocos2d模块使用。


    unsigned int m_uReference;

    对象计数器,构造时为1,当调用对象的release成员函数时,这个值将自减,如果减少到0,那么对象被自己删除。


    unsigned int m_uAutoReleaseCount;

    调用autorelease的次数记录,初始化为0,调用一次自增1,用于析构函数检查是否需要从对象池中清除自身。

    函数

    CCObject(void);

    构造函数,主要的功能是将成员函数初始化。

    构造函数实现中,用一个静态变量来管理m_uID。

    CCObject::CCObject(void)
    : m_nLuaID(0)
    , m_uReference(1) // when the object is created, the reference count of it is 1
    , m_uAutoReleaseCount(0)
    {
        static unsigned int uObjectCount = 0;
    
        m_uID = ++uObjectCount;
    }


    virtual ~CCObject(void);

    析构函数,主要的功能是清除该对象与对象池、脚本对象管理之间的关系

    CCObject::~CCObject(void)
    {
        // if the object is managed, we should remove it
        // from pool manager
        if (m_uAutoReleaseCount > 0)
        {
            CCPoolManager::sharedPoolManager()->removeObject(this);
        }
    
        // if the object is referenced by Lua engine, remove it
        if (m_nLuaID)
        {
            CCScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptObjectByCCObject(this);
        }
        else
        {
            CCScriptEngineProtocol* pEngine = CCScriptEngineManager::sharedManager()->getScriptEngine();
            if (pEngine != NULL && pEngine->getScriptType() == kScriptTypeJavascript)
            {
                pEngine->removeScriptObjectByCCObject(this);
            }
        }
    }
    


    void release(void);

    release函数被调用时,计数器减一,如果计数器到0,那么

    void CCObject::release(void)
    {
        CCAssert(m_uReference > 0, "reference count should greater than 0");
        --m_uReference;
    
        if (m_uReference == 0)
        {
            delete this;
        }
    }


    void retain(void);

    增加计数器,保证对象不被删除

    void CCObject::retain(void)
    {
        CCAssert(m_uReference > 0, "reference count should greater than 0");
    
        ++m_uReference;
    }



    CCObject* autorelease(void);

    让对象池管理器管理本对象,这样程序员可以不用去delete该对象内存

    CCObject* CCObject::autorelease(void)
    {
        CCPoolManager::sharedPoolManager()->addObject(this);
        return this;
    }


    CCObject* copy(void);

    对象拷贝,这里调用了CCCopying的copyWithZone,那么copy也是和CCCopying一样没有做任何事情,拷贝工作还是需要子类做具体的实现,这里只是留有接口罢了

    CCObject* CCObject::copy()
    {
        return copyWithZone(0);
    }


    bool isSingleReference(void) const;

    这个函数只是简单判断m_uReference是否为1而已

    bool CCObject::isSingleReference(void) const
    {
        return m_uReference == 1;
    }


    unsigned int retainCount(void) const;

    返回引用个数

    unsigned int CCObject::retainCount(void) const
    {
        return m_uReference;
    }


    virtual bool isEqual(const CCObject* pObject);

    判断是否相等

    bool CCObject::isEqual(const CCObject *pObject)
    {
        return this == pObject;
    }


    virtual void acceptVisitor(CCDataVisitor& visitor);

    接受一个CCDataVisitor,可以通过该接口实现序列化等工作

    void CCObject::acceptVisitor(CCDataVisitor &visitor)
    {
        visitor.visitObject(this);
    }


    virtual void update(float dt) ;

    更新函数,CCObject没有实现,只是预留接口

    virtual void update(float dt) {CC_UNUSED_PARAM(dt);};

    其他非成员相关

    typedef void (CCObject::*SEL_SCHEDULE)(float);
    typedef void (CCObject::*SEL_CallFunc)();
    typedef void (CCObject::*SEL_CallFuncN)(CCNode*);
    typedef void (CCObject::*SEL_CallFuncND)(CCNode*, void*);
    typedef void (CCObject::*SEL_CallFuncO)(CCObject*);
    typedef void (CCObject::*SEL_MenuHandler)(CCObject*);
    typedef void (CCObject::*SEL_EventHandler)(CCEvent*);
    typedef int (CCObject::*SEL_Compare)(CCObject*);
    
    #define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)
    #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)
    #define callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR)
    #define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR)
    #define callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR)
    #define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)
    #define event_selector(_SELECTOR) (SEL_EventHandler)(&_SELECTOR)
    #define compare_selector(_SELECTOR) (SEL_Compare)(&_SELECTOR)

    以上宏,定义成员函数指针类型,用于schedule回调指针


    总结

    CCObject作为cocos2dx中大部分类的父类,提供了

    1)内存管理功能

    2)为脚本提供对象ID管理

    3)序列化接口

    4)提供update接口

  • 相关阅读:
    【贪心】【堆】Gym
    【并查集】Gym
    【拓扑排序】【bitset】Gym
    【递归】【线段树】【堆】AtCoder Regular Contest 080 E
    【二分图】【并查集】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem L. Canonical duel
    【动态规划】【滚动数组】【bitset】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem J. Terminal
    【二分】【字符串哈希】【二分图最大匹配】【最大流】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem I. Minimum Prefix
    【枚举】【最小表示法】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem F. Matrix Game
    【推导】【构造】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem E. Space Tourists
    【推导】【贪心】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem D. Clones and Treasures
  • 原文地址:https://www.cnblogs.com/new0801/p/6177234.html
Copyright © 2011-2022 走看看