c的类成员只有方法与字段,没有属性和事件,这给开发者带来了不便。为了实现objective-c中提供的属性功能,我们不得不使用方法来模拟get和set访问器。cocos2d-x规定了属性访问器的方法名称以get或set为前缀,后接属性名。在ccnode中包含大量属性,例如用于给
c++的类成员只有方法与字段,没有属性和事件,这给开发者带来了不便。为了实现objective-c中提供的属性功能,我们不得不使用方法来模拟get和set访问器。cocos2d-x规定了属性访问器的方法名称以get或set为前缀,后接属性名。在ccnode中包含大量属性,例如用于给节点做标记的tag属性,它的访问器分别为gettag()和settag(int atag),其实现原理大致如下:
int tag;
int gettag() { return tag; }
void settag(int atag) { tag = atag; }
在这个例子中,属性的类型是int,处理较为简单。由于涉及内存管理,开发中我们对数值类型、结构体类型、cocos2d-x对象的处理方法都不尽相同,这一点在读者了解2.3节介绍的cocos2d-x内存管理后,会有更深刻的体会。
为每一个属性编写一个或两个访问器方法是一项十分枯燥的任务,为了避免重复性的工作,cocos2d-x提供了一系列宏来帮助我们方便地创建属性。表2-1列举了所有属性相关的宏,它们定义在引擎目录中的“platform/ccplatformmacros.h”中。
表2-1 cocos2d-x中与属性相关的宏
宏 描述
cc_property 定义一个属性及其访问器,没有实现。通常用于简单的值类型
cc_property_readonly 定义一个属性,只包含get访问器,没有实现
cc_property_pass_by_ref 定义一个属性,访问器使用引用类型传递参数,没有实现。通常用于结构体类型
cc_property_readonly_pass_by_ref 定义一个属性,只包含get访问器,且使用引用类型传递参数,没有实现
(续)
宏 描述
cc_property_readonly_pass_by_ref 定义一个属性,只包含get访问器,且使用引用类型传递参数,没有实现
cc_synthesize 同cc_property,实现了访问器方法
cc_synthesize_readonly 同cc_property_readonly,实现了访问器方法
cc_synthesize_pass_by_ref 同cc_property_pass_by_ref,实现了访问器方法
cc_synthesize_readonly_pass_by_ref 同cc_property_readonly_pass_by_ref,实现了访问器方法
cc_synthesize_retain 同cc_property,实现了访问器方法。用于派生自ccobject的类型,访问器采取cocos2d-x的内存管理机制自动维护对象的引用计数
这些宏只要写在类的定义之中即可。每个宏都有3个参数,分别是:
vartype,属性类型,如果属性类型是对象,需要写成指针的形式;
varname,属性的私有字段名称;
funname,属性的访问器名称,也就是紧接在get或set前缀后的部分。
利用cocos2d-x提供的宏,上面的tag属性定义就可以用下面一条语句代替了:
cc_synthesize(int, tag, tag)