Cocos2d-X学习之Ref类

先看看定义该类的头文件——CCRef.h

  1 /****************************************************************************
2 Copyright (c) 2010-2012 cocos2d-x.org
3 Copyright (c) 2013-2014 Chukong Technologies
4
5 http://www.cocos2d-x.org
6
7 Permission is hereby granted, free of charge, to any person obtaining a copy
8 of this software and associated documentation files (the "Software"), to deal
9 in the Software without restriction, including without limitation the rights
10 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 copies of the Software, and to permit persons to whom the Software is
12 furnished to do so, subject to the following conditions:
13
14 The above copyright notice and this permission notice shall be included in
15 all copies or substantial portions of the Software.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 THE SOFTWARE.
24 ****************************************************************************/
25
26 #ifndef __CCREF_H__
27 #define __CCREF_H__
28
29 #include "CCPlatformMacros.h"
30 #include "ccConfig.h"
31
32 NS_CC_BEGIN
33
34 /**
35 * @addtogroup base_nodes
36 * @{
37 */
38
39 class Ref;
40
41 /** Interface that defines how to clone an Ref */
42 class CC_DLL Clonable
43 {
44 public:
45 /** returns a copy of the Ref */
46 virtual Clonable* clone() const = 0;
47 /**
48 * @js NA
49 * @lua NA
50 */
51 virtual ~Clonable() {};
52
53 /** returns a copy of the Ref.
54 @deprecated Use clone() instead
55 */
56 CC_DEPRECATED_ATTRIBUTE Ref* copy() const
57 {
58 // use "clone" instead
59 CC_ASSERT(false);
60 return nullptr;
61 }
62 };
63
64 class CC_DLL Ref
65 {
66 public:
67 /**
68 * Retains the ownership.
69 *
70 * This increases the Ref‘s reference count.
71 *
72 * @see release, autorelease
73 * @js NA
74 */
75 void retain();
76
77 /**
78 * Release the ownership immediately.
79 *
80 * This decrements the Ref‘s reference count.
81 *
82 * If the reference count reaches 0 after the descrement, this Ref is
83 * destructed.
84 *
85 * @see retain, autorelease
86 * @js NA
87 */
88 void release();
89
90 /**
91 * Release the ownership sometime soon automatically.
92 *
93 * This descrements the Ref‘s reference count at the end of current
94 * autorelease pool block.
95 *
96 * If the reference count reaches 0 after the descrement, this Ref is
97 * destructed.
98 *
99 * @returns The Ref itself.
100 *
101 * @see AutoreleasePool, retain, release
102 * @js NA
103 * @lua NA
104 */
105 Ref* autorelease();
106
107 /**
108 * Returns the Ref‘s current reference count.
109 *
110 * @returns The Ref‘s reference count.
111 * @js NA
112 */
113 unsigned int getReferenceCount() const;
114
115 protected:
116 /**
117 * Constructor
118 *
119 * The Ref‘s reference count is 1 after construction.
120 * @js NA
121 */
122 Ref();
123
124 public:
125 /**
126 * @js NA
127 * @lua NA
128 */
129 virtual ~Ref();
130
131 protected:
132 /// count of references
133 unsigned int _referenceCount;
134
135 friend class AutoreleasePool;
136
137 #if CC_ENABLE_SCRIPT_BINDING
138 public:
139 /// object id, ScriptSupport need public _ID
140 unsigned int _ID;
141 /// Lua reference id
142 int _luaID;
143 #endif
144 };
145
146 class Node;
147
148 typedef void (Ref::*SEL_CallFunc)();
149 typedef void (Ref::*SEL_CallFuncN)(Node*);
150 typedef void (Ref::*SEL_CallFuncND)(Node*, void*);
151 typedef void (Ref::*SEL_CallFuncO)(Ref*);
152 typedef void (Ref::*SEL_MenuHandler)(Ref*);
153 typedef void (Ref::*SEL_SCHEDULE)(float);
154
155 #define callfunc_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFunc>(&_SELECTOR)
156 #define callfuncN_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncN>(&_SELECTOR)
157 #define callfuncND_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncND>(&_SELECTOR)
158 #define callfuncO_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncO>(&_SELECTOR)
159 #define menu_selector(_SELECTOR) static_cast<cocos2d::SEL_MenuHandler>(&_SELECTOR)
160 #define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
161
162 // end of base_nodes group
163 /// @}
164
165 NS_CC_END
166
167 #endif // __CCREF_H__

CCRef.h

头文件中主要有以下内容:

  1、Clonable接口的定义;

  2、Ref类的定义;

  3、六个回调函数宏定义(包括相应类型定义);

Clonable接口成员如下:

由接口的名称含义就可以知道,该接口的主要作用就是克隆Ref类的成员,由于该头文件之前还未有Ref类的定义,而接口函数中有使用了Ref,所以又一个Ref类的前向引用(C++好像有这么个概念)

clone()和copy()均可以完成Ref对象的克隆,不过新版本中copy()已经废弃,建议使用clone();

Ref类的函数成员如下:

retain();每调用一次引用次数+1;

release();每调用一次引用次数-1;

getReferenceCount();获取引用的次数;

autorelease();每调用一次autorelease pool 中的Ref引用数-1;

Ref类的数据成员中,有一个无符号整型成员 _referenceCount,用来记录引用次数的;

值得注意的是Ref类还有一个友元类AutoreleasePool;

回调函数及相应类型定义


typedef void (Ref::*SEL_CallFunc)();                            //
typedef void (Ref::*SEL_CallFuncN)(Node*);
typedef void (Ref::*SEL_CallFuncND)(Node*, void*);
typedef void (Ref::*SEL_CallFuncO)(Ref*);
typedef void (Ref::*SEL_MenuHandler)(Ref*);
typedef void (Ref::*SEL_SCHEDULE)(float);

#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 schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)

关于回调函数宏定义及类型定义,下篇中会详细说明,因为引擎中涉及到太多太多,而且还不是很好理解。

Cocos2d-X学习之Ref类

时间: 2024-08-25 18:01:03

Cocos2d-X学习之Ref类的相关文章

Cocos2d之Ref类与内存管理使用详解

一.简介 用C++和JAVA编写过程序的朋友一定会为两种语言不同的内存管理机制懊恼.JAVA程序运行在JVM之上,由JVM自动实现内存管理,开发者只管申请内存而不用手动释放内存.当JAVA中对象没有被任何引用变量(类似于C和C++的指针)引用时,JVM会将对象释放掉.C++和C一样,是编译后能够直接被操作系统执行的语言,没有虚拟机负责其内存管理,因此需要在程序中管理内存.本文主要介绍如何使用cocos2d提供的内存管理机制. Cocos2d-x借鉴了“引用计数”思想,实现了一定程度上的自动内存管

[当我在研究Cocos-2dx的源代码时,我在想什么]-Ref类,一切的起源

[名词解释] 引用计数:引用计数是现代内存管理中常常使用到的一个概念.它的基本思想是通过计数方式实现多个不同对象同一时候引用一个共享对象,详细地讲,当创建一个对象的实例并在堆上分配内存时,对象的引用计数为1,在其它对象中须要持有这个共享对象时.须要把共享对象的引用计数加1.当其它对象不再持有该共享对象时,共享对象的引用计数减1,当共享对象的引用计数变成0时.对象的内存会被马上释放.(部分截取自维基百科). 比較著名的使用引用计数的有COM和Objective-C,在COM的IUnknow接口中定

Mono源代码学习笔记:Console类(六)

Unix 终端的基础知识 许多 Unix 系统使用终端.但是在今天的许多情况下,终端也许是一个运行终端程序的 PC 机.从历史上来说,不同的生产商提供了大量的硬件终端.Linux 操作系统包含一个环境变量 TERM,用来表示我们正在使用的终端的类型,如下所示: [email protected]:~$ w 16:35:13 up 6 days, 7:36, 2 users, load average: 0.62, 0.34, 0.25 USER TTY FROM [email protected

[当我在研究Cocos-2dx的源码时,我在想什么]-Ref类,一切的起源

[名词解释] 引用计数:引用计数是现代内存管理中经常使用到的一个概念,它的基本思想是通过计数方式实现多个不同对象同时引用一个共享对象,具体地讲,当创建一个对象的实例并在堆上分配内存时,对象的引用计数为1,在其他对象中需要持有这个共享对象时,需要把共享对象的引用计数加1,当其他对象不再持有该共享对象时,共享对象的引用计数减1,当共享对象的引用计数变成0时,对象的内存会被立即释放.(部分截取自维基百科). 比较著名的使用引用计数的有COM和Objective-C,在COM的IUnknow接口中定义了

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

[cocos2dx笔记008]cocos2d 用luabridge手动绑定类

基于cocos2dx 2.2.2版本.这几天使用了cocostudio实现了,动画,骨骼动画,UI编辑,粒子效果,虽然有些不足,但已经算是非常好了.今天尝试用lua,这个非常简单,创建的时候,设置语言为lua,那就可以创建lua工程. 在cocos2d-x-2.2.2\tools\project-creator下运行: python create_project.py -project test_lua -package com.android.zdhsoft -language lua xco

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

C++ Primer 学习笔记_56_类与数据抽象 --消息处理示例

复制控制 --消息处理示例 说明: 有些类为了做一些工作需要对复制进行控制.为了给出这样的例子,我们将概略定义两个类,这两个类可用于邮件处理应用程序.Message类和 Folder类分别表示电子邮件(或其他)消息和消息所出现的目录,一个给定消息可以出现在多个目录中.Message上有 save和 remove操作,用于在指定Folder中保存或删除该消息. 数据结构: 对每个Message,我们并不是在每个Folder中都存放一个副本,而是使每个Message保存一个指针集(set),set中

C++ Primer 学习笔记_57_类与数据抽象 --管理指针成员

复制控制 --管理指针成员 引言: 包含指针的类需要特别注意复制控制,原因是复制指针时只是复制了指针中的地址,而不会复制指针指向的对象! 将一个指针复制到另一个指针时,两个指针指向同一对象.当两个指针指向同一对象时,可能使用任一指针改变基础对象.类似地,很可能一个指针删除了一对象时,另一指针的用户还认为基础对象仍然存在.指针成员默认具有与指针对象同样的行为. 大多数C++类采用以下三种方法之一管理指针成员: 1)指针成员采取常规指针型行为:这样的类具有指针的所有缺陷但无需特殊的复制控制! 2)类