cocos2d-x CCArray
转自:http://blog.csdn.net/onerain88/article/details/8164210
1. CCArray只是提供了一个面向对象的封装类
其继承于CCObject类(CCObject的存在主要是为了自动管理内存),并提供了一系列接口,包括
创建
- /** Create an array */
- static CCArray* create();
- /** Create an array with some objects */
- static CCArray* create(CCObject* pObject, ...);
- /** Create an array with one object */
- static CCArray* createWithObject(CCObject* pObject);
- /** Create an array with capacity */
- static CCArray* createWithCapacity(unsigned int capacity);
- /** Create an array with an existing array */
- static CCArray* createWithArray(CCArray* otherArray);
添加
- /** Add a certain object */
- void addObject(CCObject* object);
- /** Add all elements of an existing array */
- void addObjectsFromArray(CCArray* otherArray);
- /** Insert a certain object at a certain index */
- void insertObject(CCObject* object, unsigned int index);
删除
- /** Remove last object */
- void removeLastObject(bool bReleaseObj = true);
- /** Remove a certain object */
- void removeObject(CCObject* object, bool bReleaseObj = true);
- /** Remove an element with a certain index */
- void removeObjectAtIndex(unsigned int index, bool bReleaseObj = true);
- /** Remove all elements */
- void removeObjectsInArray(CCArray* otherArray);
- /** Remove all objects */
- void removeAllObjects();
- /** Fast way to remove a certain object */
- void fastRemoveObject(CCObject* object);
- /** Fast way to remove an element with a certain index */
- void fastRemoveObjectAtIndex(unsigned int index);
等等。。。
其中比较有意思的是remove和fastRemove方法,看了源码可知
remove是比较完整的从CCArray对象中删除
而fastRemove只是将对应的CCArray中的某个元素进行了释放
从代码来看,区别主要在于有没有讲删除元素之后的元素向前移动覆盖掉删除元素的位置,差别代码如下:
- unsigned int remaining = arr->num - index;
- if(remaining>)
- {
- memmove((void *)&arr->arr[index], (void *)&arr->arr[index+], remaining * sizeof(CCObject*));
- }
2. 细节是用c来实现的,其数据结构为
- typedef struct _ccArray {
- unsigned int num, max;
- CCObject** arr;
- } ccArray;
就是这么简单,一个指向CCObject指针的指针(也可以认为是一个数组元素为CCObject指针的数组),一个最大容量和当前元素数量!
这里使用CCObject指针作为元素类型,是为了达到自动管理内存的目的
以及对应CCArray类的接口的一些实现,具体参看代码ccArray.h和ccArray.cpp(注意大小写。。。)
3. 另一个ccArray
在ccArray.h的下半段,还有一个结构体的定义
- typedef struct _ccCArray {
- unsigned int num, max;
- void** arr;
- } ccCArray;
乍一看和ccArray差不多,其实其主要差别是数组元素类型 void*
为什么会有ccCArray的存在?难道ccArray不够吗?
确实是不够,因为ccArray的数组元素类型是CCObject*,但是我们的项目甚至包括引擎中的类型,不一定都是CCObject的子类,ccCArray是为我们提供了一套近似于ccArray的接口,存储类型更为宽泛
4. 使用CCArray注意事项
CCArray一般不会被添加到其他的类中,所以其引用计数为1,并且被设置为autorelease
所以,创建的CCArray对象一定要retain,并在其析构方法中调用release释放内存
cocos2d-x CCArray的更多相关文章
- cocos2d CCArray
CCArray* arr=CCArray::create(); arr->retain();//如果不加这个东西,CCArray会被清空 arr->addObject(CCSprite:: ...
- cocos基础教程(5)数据结构介绍之cocos2d::Value
1.概述 cocos2d::Valie 是一个包含了很多原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vec ...
- cocos2d::Vector
C++中的vector使用范例 一.概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector是一个容器,它能够存放各种类型的对象,简 ...
- Cocos2d-x 3.x学习笔记(一):开始Cocos2d之旅
首先,进入官网下载cocos2d-x:http://www.cocos.com/download/,当然你需要注册一个账号才可以下载. 接下来需要跟着官网的配置文档配置一下开发环境,不得不说,Coco ...
- Cocos2d—X游戏开发之CCScrollView(滑动视图)(十二)
CCScrollView在Cocos2d-X引擎中主要使用在图片尺寸远大于屏幕尺寸的时候使用. 总体来说,使用起来比较简单. 一个是CCScrollView控件本身,一个是CCScrollViewDe ...
- cocos2d基础篇笔记四
1.//有两种集合 //第一种是array 特点:插入,删除效率低,可是查找效率高 //另外一种是list 特点:插入,删除效率高,可是查找效率低 //分析这个游戏: 插入的时候:怪物,射弹出现时, ...
- 7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml
数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDef ...
- cocos2D(五岁以下儿童)---- CCNode
本将主要介绍下CCNode这个类.CCNode是全部节点的基类,当中包含我们经常使用的CCScene(场景).CCLayer(图层).CCSprite(精灵)等.它是一个不可以可视化显示的抽象类,仅仅 ...
- 转载+自练(莫喷)怎样在cocos2d 2.1.4里面使用动画和Texture Packer
本文实践自 Ray Wenderlich.Tony Dahbura 的文章<How to Use Animations and Sprite Sheets in Cocos2D 2.X>, ...
- iOS cocos2d游戏引擎的了解之一
ios游戏引擎之Cocos2d(一) cocos2d是一个免费开源的ios游戏开发引擎,并且完全采用object-c进行编写,这对于已经用惯object-c进行ios应用开发的童鞋来说非常容易上手.这 ...
随机推荐
- QPS、PV和需要部署机器数量计算公式(转)
术语说明: QPS = req/sec = 请求数/秒 [QPS计算PV和机器的方式] QPS统计方式 [一般使用 http_load 进行统计] QPS = 总请求数 / ( 进程总数 * 请求 ...
- 【C#学习笔记】指针使用
using System; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { ; un ...
- 【C#学习笔记】退出程序
1.this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit(); 强制所有消息中 ...
- jQuery避免$符和其他JS库冲突的方法对比
1.如果jquery库在第三方库之后引用.这个时候jquery库会占用$. 解决办法:剔除$符号的使用权. <script type="text/javascript" sr ...
- Mybaits+SpringMVC项目(含代码生成工具源码)
大家下载下来修改数据库配置应该就能运行起来,里面有一个SM的简单案例了,还有说明文件. 运行效果 工具类可以生成Springmvc+mybatis的相关类和配置文件,并具有增删查改的功能, ...
- C# DataGridView的列对象属性探讨 (未完待续)
比较难的几个属性的释义[1]:
- linux命令——磁盘命令mkdir
一.介绍 mkdir 命令用于创建文件夹或目录(类似dos下的md命令),要求创建目录的用户在当前目录中具有写权限, 并且指定目录名不能是当前目录中已有的目录或文件名称.名称区分大小写. 二.用法及参 ...
- 【剑指offer 面试题12】打印1到最大的n位数
思路: 用n位字符数组表示n位数,通过递归的方式逐层(位)遍历,递归终止时打印. #include "stdio.h" #include "string.h" ...
- RockMongo安装使用笔记
下载nginx最新版本下载PHP,5.X版本即可,非线程安全的的,因为nginx用的是fastcgi下载rockmongo最新版本下载php_mongo组件 在rockmongo里的readme里有下 ...
- css样式表中的样式覆盖顺序
刚才写zenktodo的时候,通过动态添加class的方式修改一个div的样式,总是不起作用. #navigator { height: 100%; width: 200; position: abs ...