原地址:http://blog.csdn.net/onerain88/article/details/8164210
cocos2d-x移植於cocos2d-iphone,cocos2d-iphone的架構和設計更符合Objective-C的語法,所以cocos2d-x在移植的過程中,也引入了CCArray的概念!
CCArray在設計和使用上更符合Objective-C的風格,類似於Objective-C中的NSArray!
1. CCArray只是提供了一個面向對象的封裝類
其繼承於CCObject類(CCObject的存在主要是爲了自動管理內存),並提供了一系列接口,包括
創建
- <span style="font-size:14px;"> /** Create an array */
- static CCArray* create();
- /** Create an array with some objects */
- static CCArray* create(CCObject* pObject, ...);
- /** Create an array with one object */
- static CCArray* createWithObject(CCObject* pObject);
- /** Create an array with capacity */
- static CCArray* createWithCapacity(unsigned int capacity);
- /** Create an array with an existing array */
- static CCArray* createWithArray(CCArray* otherArray);</span>
添加
- <span style="font-size:14px;">/** Add a certain object */
- void addObject(CCObject* object);
- /** Add all elements of an existing array */
- void addObjectsFromArray(CCArray* otherArray);
- /** Insert a certain object at a certain index */
- void insertObject(CCObject* object, unsigned int index);</span>
刪除
- <span style="font-size:14px;">/** Remove last object */
- void removeLastObject(bool bReleaseObj = true);
- /** Remove a certain object */
- void removeObject(CCObject* object, bool bReleaseObj = true);
- /** Remove an element with a certain index */
- void removeObjectAtIndex(unsigned int index, bool bReleaseObj = true);
- /** Remove all elements */
- void removeObjectsInArray(CCArray* otherArray);
- /** Remove all objects */
- void removeAllObjects();
- /** Fast way to remove a certain object */
- void fastRemoveObject(CCObject* object);
- /** Fast way to remove an element with a certain index */
- void fastRemoveObjectAtIndex(unsigned int index);</span>
其中比較有意思的是remove和fastRemove方法,看了源碼可知
remove是比較完整的從CCArray對象中刪除
而fastRemove只是將對應的CCArray中的某個元素進行了釋放
從代碼來看,區別主要在於有沒有講刪除元素之後的元素向前移動覆蓋掉刪除元素的位置,差別代碼如下:
- <span style="font-size:14px;">unsigned int remaining = arr->num - index;
- if(remaining>0)
- {
- memmove((void *)&arr->arr[index], (void *)&arr->arr[index+1], remaining * sizeof(CCObject*));
- }</span>
2. 細節是用c來實現的,其數據結構爲
- <span style="font-size:14px;">typedef struct _ccArray {
- unsigned int num, max;
- CCObject** arr;
- } ccArray;</span>
就是這麼簡單,一個指向CCObject指針的指針(也可以認爲是一個數組元素爲CCObject指針的數組),一個最大容量和當前元素數量!
這裏使用CCObject指針作爲元素類型,是爲了達到自動管理內存的目的
以及對應CCArray類的接口的一些實現,具體參看代碼ccArray.h和ccArray.cpp(注意大小寫。。。)
3. 另一個ccArray
在ccArray.h的下半段,還有一個結構體的定義
- <span style="font-size:14px;">typedef struct _ccCArray {
- unsigned int num, max;
- void** arr;
- } ccCArray;</span>
爲什麼會有ccCArray的存在?難道ccArray不夠嗎?
確實是不夠,因爲ccArray的數組元素類型是CCObject*,但是我們的項目甚至包括引擎中的類型,不一定都是CCObject的子類,ccCArray是爲我們提供了一套近似於ccArray的接口,存儲類型更爲寬泛
4. 使用CCArray注意事項
CCArray一般不會被添加到其他的類中,所以其引用計數爲1,並且被設置爲autorelease
所以,創建的CCArray對象一定要retain,並在其析構方法中調用release釋放內存