本文仅供个人记录和复习,不用于其他用途
2.x与3.x
2.x版本:
CCArray
CCDictionary
CCString
3.x版本:
Vector
Map
Value
CCArray
看名字就能知道大概的意思,这个是Cocos自定义的数组,方便存储Cocos中的数组型数据。
创建
|
|
插入
|
|
删除
|
|
remove
和fastRemove
的区别在于,remove
将元素删除,后面的元素向前移动。而fastRemove
只是释放了对应元素,整体的结构没变。
遍历
遍历用到的是CCARRAY_FOREACH(arr, obj)
这个宏,有正向和逆向之分:
|
|
上面这个是3.x版本的代码,但是基本思路是一样的。
操作元素
|
|
注意,容量和个数是不一样的,个数<=容量,添加元素前会先判断是否要增加容量。
操作CCArray内容
|
|
判等
判断2个CCArray是否相等使用isEqualToArray()
,判断相等的条件是CCArray
中的每个元素相等即可,与CCArray
的容量无关。
代码实现
|
|
遍历的操作已经用宏定义好了,我们只需要编写相应的代码即可。
注意事项
CCArray
不会使用addChild()
加到其他类,所以它的引用计数是1,而且被设置为自动释放。所以创建CCArray
对象时要记得调用retain
,而且在析构的时候也要调用release
来释放内存。
CCDictionary
CCDictionary
支持两种类型的关键字,一个是std::string
,一个是int
。一个CCDictionary
实例对象只支持唯一的关键字。所以在你调用setObject
方法的时候,你需要确认一下。
key
CCDictionary
只支持整型和字符串型这两种类型,key
的作用主要是方便取出对应元素。
|
|
CCDictElement
CCDictElement
是CCDictionary
的一个元素,包含了一个key-value
。key
支持整型和字符串,使用的时候要注意在同一个CCDictionary
中key
类型必须要一致,value
可以不一致。总的来讲,要么key
都是字符串,要么都是整型,不能都有:
创建
|
|
查找
|
|
增加
|
|
移除
|
|
其他操作
|
|
遍历
|
|
代码示例
|
|
CCString
CCString
是自动释放的,除非你retian
了。
创建
|
|
转换
CCString
可以转换成其他类型的变量:
|
|
常用宏定义
|
|
这样我们可以方便地创建许多CCString
对象。
Vector
Vector
类似于C++标准库中的vector
,用于替代CCArray
。Vector
是一个可以动态增长的容器,按照一定的顺序存储数据。T
必须是继承自Ref
的指针,其他类型(包括基本类型)都不能作为模板参数。实例化Vector
对象时,一般在栈上实例化,所以不用担心内存释放的问题。Vector
不是继承自Ref
,不能使用retain
和release
进行内存管理。
注意,Vector
没有重载[],不能使用下标来获取对象。
创建
为了演示,这里先创建两个精灵:
|
|
创建容器,将精灵加入:
|
|
获取容器大小
|
|
遍历
|
|
删除容器中的精灵
|
|
其他用法
|
|
Map
Map
是用来替代CCDictionary
的。内存管理我们无须担心,不过如果使用了new
来分配内存,我们还是得使用delete
释放内存。一般情况下,不要使用new
。同样,Map
也不能使用引用计数的方法管理内存。
注意,Map
没有重载[],不能使用下标来获取对象。
创建
|
|
将对象加入容器
|
|
取出容器中的元素
|
|
其他功能
|
|
Map
对象的元素是键-值对,也就是每个元素包含两个部分:键以及由键关联的值。这种键和键值组成一个pair
类型,它的first
元素指向键,second
元素则为元素。如下:
|
|
Value
Value
可以保存任意基本类型,而Cocos中的std::vector
、std::unordered_map
std::unordered_map
Value
中。之前的CCBool
、CCInt
等将被废除,改为统一的变量。
内存管理
Value
由它的析构函数释放内存,Value
包含以下成员:
|
|
_baseData
、_strData
和_type
是由编译器和它们的析构函数负责释放内存的,而Value
的析构函数释放_vectorData
、_mapData
和intKeyMapData
。Value
同样不能用引用计数管理内存。
基本用法
|
|
输出如下:
cocos2d: val is null
cocos2d: The description of the integer value:
65
cocos2d: val1.asByte() = A
cocos2d: The description of the string value:
string
cocos2d: The description of the Vector value:
true
cocos2d: The description of the Map value:
true
cocos2d: The description of the Value-type value:
true
cocos2d: operator-> The description of val2:
65
cocos2d: operator-> The description of val4:
4
总结
优先使用新的数据结构,当要使用基本类型的聚合时,将基本类型包装成cocos2d::Value
,然后将它们和模版容器cocos2d::Vector
和cocos2d::Map
联合使用。