cocos2d-x 之 CCArray 源码分析
cocos2d-x 自己实现了一个数组CCArray ,下面我们来分析一下CCArray的源码
CCArray继承CCObject,所以,CCArray也具有引用计数功能和内存自动管理功能。
数组的源码如下:
class CC_DLL CCArray : public CCObject
{
public:
/************************************************************************/
/* 构造析构函数 */
/************************************************************************/
//构造函数
CCArray(); //capacity 为数组元素的个数,创建的数组至少有1个元素,如果传的是0,也会创建包含一个元素大小的数组
CCArray(unsigned int capacity); //构造函数
~CCArray(); /************************************************************************/
/* 创建数组 ,一共有7个函数 */
/************************************************************************/
// 创建一个新的数组,默认大小为1个元素的数组
static CCArray* create(); //根据数组中包含的的元素创建一个新的数组,注意,最后一个参数必须为NULL。如CCArray::create(pobj1,pobj2,NULL);
static CCArray* create(CCObject* pObject, ...); //创建一个包含一个元素pObject的数组
static CCArray* createWithObject(CCObject* pObject); //创建一个包含capacity个元素的数组
static CCArray* createWithCapacity(unsigned int capacity); //根据一个已经存在的数组创建一个新的数组,这个函数没有实现。暂时用不到
static CCArray* createWithArray(CCArray* otherArray); /*
根据一个 .plist 文件创建一个新的数组,创建的数组调用了autorelease()函数,所以不用担心内存的释放
*/
static CCArray* createWithContentsOfFile(const char* pFileName); /*
与上面一个函数功能一样,但是没有调用autorelease()函数,所以使用完后需要调用 release();
*/
static CCArray* createWithContentsOfFileThreadSafe(const char* pFileName); /************************************************************************/
/* 初始化数组 ,一共有5个函数 */
/************************************************************************/
//初始化一个数组,此数组只包含一个元素大小
bool init(); //初始化一个数组,此数组只包含一个元素,这个元素是pObject
bool initWithObject(CCObject* pObject); //初始化一个数组,此数组包含多个指定的元素,注:函数有最后一个参数为NULL
bool initWithObjects(CCObject* pObject, ...); //初始化一个数组,此数组包含capacity个元素大小,如果capacity为0,那么创建的是一个只有1个元素大小的数组
bool initWithCapacity(unsigned int capacity); //初始化一个数组,数组的元素的大小等于otherArray中已经存在的元素的个数相同,并且把other中的元素分别赋值给新创建的数组
//注:在把otherArray中的元素复制到新创建的数组中的过程中,别忘了 pObject->retain()
bool initWithArray(CCArray* otherArray); /************************************************************************/
/* 初始化数组 ,一共有8个函数 */
/************************************************************************/
//返回数组中已经存在的元素的个数
unsigned int count() const; //返回数组的总大小
unsigned int capacity() const; //根据一个给定的元素,返回此元素在数组中的索引,以第1次找到的为准,如果数组中不包含这个元素,返回CC_INVALID_INDEX
unsigned int indexOfObject(CCObject* object) const; //根据一个给定的数组中的索引,返回其对象
CCObject* objectAtIndex(unsigned int index); //返回数组中的最后一个元素
CCObject* lastObject(); //随机返回数组中的一个元素
CCObject* randomObject(); //判断元素object是否包含在数组中,true 则元素在此数组中,false则表示元素不在数组中
bool containsObject(CCObject* object) const; //判断两个数组是否相等,具体是指两个数组中的相应的索引上的元素一一相等,则两数组相等
bool isEqualToArray(CCArray* pOtherArray); /************************************************************************/
/* 添加元素 ,一共有3个函数 */
/************************************************************************/
//在数组的最后一个元素的后面再添加一个元素object,如果数组空间不足,则数组会再动态申请2倍于以前数组的最大的空间
void addObject(CCObject* object); //把数组otherArray中的相应元素分别添加到数组中,如果空间不足,则数组会再动态申请2倍于以前数组的最大的空间
void addObjectsFromArray(CCArray* otherArray); //将object插入到数组中index位置上,从index位置往后每个元素向后移动一个位置
//这个过程使用了memmove()函数
void insertObject(CCObject* object, unsigned int index); /************************************************************************/
/* 删除元素 ,一共有7个函数 */
/************************************************************************/
//删除数组中的最后一个元素,如果bReleaseObj为true,则会调用元素的release()函数
//注:特别注意,这个函数实际上并没有真正的把元素删除,只是把当前的元素的个数减1,从而可以正确确定索引的范围了
void removeLastObject(bool bReleaseObj = true); //删除数组中第一次出现的object , bReleaseObj的意义同上
void removeObject(CCObject* object, bool bReleaseObj = true); //删除指定索引上的元素
void removeObjectAtIndex(unsigned int index, bool bReleaseObj = true); //删除数组中所有包含otherArray中元素的元素
void removeObjectsInArray(CCArray* otherArray); //删除数组中所有的元素,但数组的内存没有释放
void removeAllObjects(); //fast删除,最快速的删除,原理其实就是把数组中的最后一个元素赋值给了object对应的位置。并且数组的当前元素个数减1
//使用此函数一定要注意,要删除的那个位置的值不存在了
//只是替换了数组的最后一个元素,很可能会造成内存泄露,因为并没有真正删除object
void fastRemoveObject(CCObject* object); //原理同上
void fastRemoveObjectAtIndex(unsigned int index); // Rearranging Content //交换数组中两个元素,就是object1跑到object2的位置上了,同理,object2跑到object1的位置上了
void exchangeObject(CCObject* object1, CCObject* object2); //交换数组中index1和index2两个索引对应的两个元素,其实上面的函数就是调用了此函数
void exchangeObjectAtIndex(unsigned int index1, unsigned int index2); //将uIndex位置的元素替换为pObject
void replaceObjectAtIndex(unsigned int uIndex, CCObject* pObject, bool bReleaseObject = true); //翻转数组
void reverseObjects(); //缩小数组的空间,让数组占用的内存符合元素的数量
void reduceMemoryFootprint(); //virtual函数,返回当前数组的一个副本
virtual CCObject* copyWithZone(CCZone* pZone); /* override functions */
virtual void acceptVisitor(CCDataVisitor &visitor); public:
ccArray* data;
};
cocos2d-x 之 CCArray 源码分析的更多相关文章
- cocos2d-x 之 CCArray 源码分析(2)
cocos2d-x 自己实现了一个数组CCArray ,下面我们来分析一下CCArray的源码 CCArray继承CCObject,所以,CCArray也具有引用计数功能和内存自动管理功能. 数组的源 ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- java使用websocket,并且获取HttpSession,源码分析
转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
随机推荐
- 8个超炫酷仿HTML5动画源码
1.jQuery万年历插件 带农历老皇历功能 这是一款基于jQuery的日历插件,这款日历插件和之前分享的日历控件有很大差异,它是一本万年历,包含了农历已经老皇历的功能,是一个挑好日子的工具.同时日历 ...
- HDOJ1181变形课 深搜回溯
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submissi ...
- Aix项目_shell_rsh_01
rsh(remote shell) 功能说明:远端登入Shell. 语 法:rsh [-dn][-l <用户名称>][主机名称或IP地址][执行指令] 补充说明:rsh提供用户环境,也就是 ...
- Hibernate的Session会话中get()和load()方法的区别
1.get和load都可以从数据库中获取数据 .get拿到的是真的对象,load拿到的是代理对象 2.get和load从数据库中获取数据,如果获取不到,get返回null,load会出现ObjectN ...
- 《A First Course in Probability》-chaper7-极限定理-强大数定理
在现实问题中我们对于一个实验往往会重复成千上万次,那么我们就需要关注在实验次数趋于无穷之后,整个实验的期望会趋于怎样一个结果.其实这一章“极限定理”都是在处理这个问题. 强大数定理: 这里的证明过程给 ...
- ngnix 配置
#运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 error_log /var/log ...
- ural 1106. Two Teams 二分图染色
链接:http://acm.timus.ru/problem.aspx?space=1&num=1106 描述:有n(n<=100)个人,每个人有一个或多个朋友(朋友关系是相互的).将其 ...
- 获取windows系统信息
在应用程序中,有时需要在界面中显示计算机的硬件信息和进程信息.在.Net中提供了可以查询信息的类.Management类,在程序中添加应用后进行使用. 1 属性 类似的属性介绍可见下面: 属性介绍 根 ...
- IOS开发中 RunLoop,RunTime
1.Objective-C中的函数调用 对于C语言,函数调用是由编译器直接转化完成的,在编译时程序就开始查找要执行的函数(C语言函数调用原理).而在OC中,我们将函数调用称为消息发送.在编译时程序不查 ...
- 开发期间的GWT设置---加快编译速度
随着项目功能的完善,GWT模块(Module)越来越多,当要以web模式编译给测试组使用时,编译的总时间越来越多,我的机器编译完8个模块,需要10分钟左右. 抽空研究了一下GWT的编译参数和GWT编译 ...