首页 > 代码库 > cocos2d-x 之 CCArray 源码分析
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;};
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。