cocos2d-x节点(CCObject.h)API

本文来自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 // EMSCRIPTEN

NS_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__


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值