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;
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM