cocos2d-x 之 CCArray 源码分析(2)

cocos2d-x 自己实现了一个数组CCArray ,下面我们来分析一下CCArray的源码

CCArray继承CCObject,所以,CCArray也具有引用计数功能和内存自动管理功能。

数组的源码如下:

cocos2d-x 之 CCArray 源码分析(2)
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 源码分析(2)

 凌晨1点多了,实在困了。明天介绍数组的遍历

晚安

cocos2d-x 之 CCArray 源码分析(2)

上一篇:融达科创 100%国产化 自主可控 飞腾FT2000-4 ITX主板


下一篇:尼康d90使用技巧