程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> cocos2d-x 之 CCArray 源碼分析,cocos2d-xccarray

cocos2d-x 之 CCArray 源碼分析,cocos2d-xccarray

編輯:C++入門知識

cocos2d-x 之 CCArray 源碼分析,cocos2d-xccarray


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 中 ccCArray 與 CCArray 的不同 還有為何找不到CCMtableArray 這個類

我們可以看一下CCArray的定義:
class CC_DLL CCArray : public CCObject
{

public:
ccArray* data;
CCArray();
CCArray(unsigned int capacity);
};
也就是說CCArray中包含了ccArray。
我們再看看ccArray的定義

typedef struct _ccArray {
unsigned int num, max;
CCObject** arr;
} ccArray;
它裡面定義了一個CCObject的對象,還有兩個整型,這樣就很明顯了,他們是包含關系。
再最新的cocos2dx版本中應該看不到CCMtableArray的定義了,我記得在以前的版本中我看到了它的定義是CCMutableArray:CCArray,後面也沒有什麼CCMutableArray的擴展方法,也就是說CCMutableArray就相當於CCArray。一次在新的版本裡面CCMutableArray就被刪除了。
想想看從我們開發者直覺上認為CCMutableArray與CCArray相比應該是CCMutableArray是可變數組,可以進行添加,刪除等操作,而CCArray是定義了好就不能再變化的數組,但是這麼認為是錯誤的,CCArray本身就是一個可變數組,可以對他進行添加,刪除等操作,所以CCMutableArray就沒有必要再要了。
希望能幫助到你。
 

cocos2d-x ccarray可以不可以做類成員,可以的話怎retain

可以,create之後retain一下,在類的析構函數裡release一下,就可以了。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved