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; };
我們可以看一下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就沒有必要再要了。
希望能幫助到你。
可以,create之後retain一下,在類的析構函數裡release一下,就可以了。