cocos2d-x节点(CCObject.h)API

来源:互联网 发布:android编程入门自学 编辑:程序博客网 时间:2024/05/21 17:10

本文来自http://blog.csdn.net/runaying ,引用必须注明出处!

cocos2d-x节点(CCObject.h)API

温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记

对象引用计数器的使用和比较

///\cocos2d-x-3.0alpha0\cocos2dx\cocoa//对象引用计数器的使用和比较#ifndef __CCOBJECT_H__#define __CCOBJECT_H__#include "cocoa/CCDataVisitor.h"#include "ccMacros.h"#ifdef EMSCRIPTEN#include <GLES2/gl2.h>#endif // EMSCRIPTENNS_CC_BEGIN/** * @addtogroup base_nodes * @{ */class Object;class Node;/** 定义如何克隆一个对象的接口 */class CC_DLL Clonable{public:/** 返回对象的副本 */    virtual Clonable* clone() const = 0;    /**     * @js NA     * @lua NA     */virtual ~Clonable() {};    /** 返回对象的副本 .     @过时不再需要建议使用新的 API。使用 clone() 代替     */    CC_DEPRECATED_ATTRIBUTE Object* copy() const    {        // 使用 "clone" 代替        CC_ASSERT(false);        return nullptr;    }};class CC_DLL Object{public:    /// 对象的 id, ScriptSupport 需要一个 public _ID    unsigned int        _ID;    /// Lua 饮用 id    int                 _luaID;protected:    /// 引用计数    unsigned int        _reference;    /// 统计 autorelease 数量    unsigned int        _autoReleaseCount;public:    /**     * Constructor     *     *创建后对象的引用计数为1     * @js NA     */    Object();        /**     * @js NA     * @lua NA     */    virtual ~Object();        /**     * 立即释放所有权.     *     * 这个对象的引用计数减1     *     * 如果引用计数器减少到 0 后这个对象就不存在了     *     * @see retain, autorelease     * @js NA     */    inline void release()    {        CCASSERT(_reference > 0, "reference count should greater than 0");        --_reference;        if (_reference == 0)            delete this;    }    /**     * 保持所有权     *     *这增加了该对象的引用计数。     *     * @see release, autorelease     * @js NA     */    inline void retain()    {        CCASSERT(_reference > 0, "reference count should greater than 0");        ++_reference;    }    /**     * 不久的某个时候自动释放所有权.     *     * 在当前自动释放池里,减少这个对象的引用计数     *     *  如果引用计数器减少到 0 后这个对象就不存在了     *     * @returns 这个对象自己.     *     * @see AutoreleasePool, retain, release     * @js NA     * @lua NA     */    Object* autorelease();    /**     * Returns 一个 boolean 值,表示这个对象是否只被饮用了一次     *也就是说,这个对象的引用计数器是否是 1.     *     * @returns 这个对象的引用计数器是否是 1.     * @js NA     */    bool isSingleReference() const;    /**     * Returns 这个对象的引用计数.     *     * @returns 这个对象的引用计数.     * @js NA     */    unsigned int retainCount() const;    /**     * Returns 一个 boolean 值,表示这个对象是否和给定对象相等.     *     * @param object    需要比较的对象.     *     * @returns True 如果这个对象和 @p 对象 equal, otherwise false.     * @js NA     * @lua NA     */    virtual bool isEqual(const Object* object);    /**     * @js NA     * @lua NA     */    virtual void acceptVisitor(DataVisitor &visitor);    /**     * @js NA     * @lua NA     */    virtual void update(float dt) {CC_UNUSED_PARAM(dt);};        friend class AutoreleasePool;};typedef void (Object::*SEL_SCHEDULE)(float);typedef void (Object::*SEL_CallFunc)();typedef void (Object::*SEL_CallFuncN)(Node*);typedef void (Object::*SEL_CallFuncND)(Node*, void*);typedef void (Object::*SEL_CallFuncO)(Object*);typedef void (Object::*SEL_MenuHandler)(Object*);typedef int (Object::*SEL_Compare)(Object*);#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)#define callfunc_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFunc>(&_SELECTOR)#define callfuncN_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncN>(&_SELECTOR)#define callfuncND_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncND>(&_SELECTOR)#define callfuncO_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncO>(&_SELECTOR)#define menu_selector(_SELECTOR) static_cast<cocos2d::SEL_MenuHandler>(&_SELECTOR)#define event_selector(_SELECTOR) static_cast<cocos2d::SEL_EventHandler>(&_SELECTOR)#define compare_selector(_SELECTOR) static_cast<cocos2d::SEL_Compare>(&_SELECTOR)// 新的 callbacks 基于 C++11#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)// end of base_nodes group/// @}NS_CC_END#endif // __CCOBJECT_H__