Cocos2d-x之 CCObject

来源:互联网 发布:武汉富士康2018java 编辑:程序博客网 时间:2024/05/21 07:55
<1>class CCObject;/** * @js NA * @lua NA */class CC_DLL CCZone{public:    CCZone(CCObject *pObject = NULL);public:    CCObject *m_pCopyObject;};构造函数实现:CCZone::CCZone(CCObject *pObject){    m_pCopyObject = pObject;}<2>class CC_DLL CCCopying{public:    virtual CCObject* copyWithZone(CCZone* pZone);};在CCCopying的子类CCObject中实现了虚函数copyWithZone,很有意思:CCObject* CCCopying::copyWithZone(CCZone *pZone){    CC_UNUSED_PARAM(pZone);    CCAssert(0, "not implement");    return 0;}宏定义如下:#define CC_UNUSED_PARAM(unusedparam) (void)unusedparam总结:该函数copyWithZone并不是纯虚函数.<3>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;};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)// end of base_nodes group/// @}NS_CC_END#endif // __CCOBJECT_H__总结:CCCopying和CCObject一块声明在CCObject中. 看源码可见,一旦继承了CCObject,那么这个类就有了引用计数的功能.看CCObject的构造函数: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;}也就是说,不管是怎么创造出来的一个类的实例对象,这个对象的引用计数初始值都是1,再看copy函数,它只是一个普普通通的成员函数,它的里面调用了copyWithZone(0),一旦执行这个函数,那么就会提示其子类的copy函数没实现这一提示信息.一旦子类实现了,那么会覆盖掉父类的copy函数.CCObject* CCObject::copy(){    return copyWithZone(0);}

0 0