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一下,就可以了。