在CCArray的头文件中定义了很多宏
(1)CCARRAY_FOREACH和CCARRAY_FOREACH_REVERSE
CCARRAY_FOREACH:从第一个元素开始遍历,如果要删除某个元素,后面的项往前移动,而该元素有两个一样的连续元素,那么第二个就被忽略掉,没有被处理。结果异常。
CCARRAY_FOREACH_REVERSE:从最后一个元素开始遍历,如果要删除某个元素,结果正常。
(2)#define arrayMakeObjectsPerformSelector(pArray, func, elementType)
让数组中所有元素去执行某一个函数
(3)#define arrayMakeObjectsPerformSelectorWithObject(pArray, func, pObject, elementType)
让数组中所有元素去执行某一个函数 ,带参数
原文:http://blog.csdn.net/huanghuanghbc/article/details/25335369
1.API
1.1.创建
1
2
3
4
5
6
7
8
9
10
|
//创建array
static
CCArray* create();
//使用一系列CCObject创建array
static
CCArray* create(CCObject* pObject, …);
//使用一个CCObject创建array
static
CCArray* createWithObject(CCObject* pObject);
//创建array并设置容量
static
CCArray* createWithCapacity(unsigned
int
capacity);
//用一个已存在的array创建另一个array
static
CCArray* createWithArray(CCArray* otherArray);
|
1.2.添加
1
2
3
4
5
6
|
//添加一个元素
void
addObject(CCObject* object);
//添加一个已存在array中所有元素
void
addObjectsFromArray(CCArray* otherArray);
//在指定位置插入元素
void
insertObject(CCObject* object, unsigned
int
index);
|
1.3.删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//移除最后一个元素
void
removeLastObject(
bool
bReleaseObj =
true
);
//移除某个元素
void
removeObject(CCObject* object,
bool
bReleaseObj =
true
);
//移除一个指定位置的元素
void
removeObjectAtIndex(unsigned
int
index,
bool
bReleaseObj =
true
);
//移除某个array
void
removeObjectsInArray(CCArray* otherArray);
//移除所有元素
void
removeAllObjects();
//快速移除某个元素
void
fastRemoveObject(CCObject* object);
//快速移除某个指定位置的元素
void
fastRemoveObjectAtIndex(unsigned
int
index);
|
1.4.操作元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//返回元素个数
unsigned
int
count()
const
;
//返回array容量
unsigned
int
capacity()
const
;
//返回指定CCObject的位置,如果不存在返回UINT_MAX
unsigned
int
indexOfObject(CCObject* object)
const
;
//返回指定位置的CCObject
CCObject* objectAtIndex(unsigned
int
index);
//返回最后一个元素
CCObject* lastObject();
//返回随机元素
CCObject* randomObject();
//返回某个元素是否存在于array中
bool
containsObject(CCObject* object)
const
;
//判断array是否相等
bool
isEqualToArray(CCArray* pOtherArray);
|
1.5.操作array内容
1
2
3
4
5
6
7
8
9
10
|
//交换2个元素
void
exchangeObject(CCObject* object1, CCObject* object2);
//交换2个指定位置元素
void
exchangeObjectAtIndex(unsigned
int
index1, unsigned
int
index2);
//用一个对象替代指定位置元素
void
replaceObjectAtIndex(unsigned
int
uIndex, CCObject* pObject,
bool
bReleaseObject =
true
);
//反转array
void
reverseObjects();
//收缩array内存以匹配元素个数
void
reduceMemoryFootprint();
|
2.remove和fastremove
2.1.普通删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//普通删除
void
ccArrayRemoveObjectAtIndex(ccArray *arr, unsigned
int
index,
bool
bReleaseObj
/* = true*/
)
{
CCAssert(arr && arr->num > 0 && index < arr->num,
"Invalid index. Out of bounds"
);
//删除元素内容,位置仍保留着
if
(bReleaseObj)
{
CC_SAFE_RELEASE(arr->arr[index]);
}
//长度减1
arr->num--;
//获得要删除的元素后的元素个数
unsigned
int
remaining = arr->num - index;
if
(remaining>0)
{
//将要删除元素后的所有元素逐个向前移动
memmove
((
void
*)&arr->arr[index], (
void
*)&arr->arr[index+1], remaining *
sizeof
(CCObject*));
}
}
|
2.2.快速删除
1
2
3
4
5
6
7
8
9
10
|
//快速删除
void
ccArrayFastRemoveObjectAtIndex(ccArray *arr, unsigned
int
index)
{
//删除元素内容,位置仍保留着
CC_SAFE_RELEASE(arr->arr[index]);
//获取最后一个元素
unsigned
int
last = --arr->num;
//把最后一个元素插到删除元素的位置上
arr->arr[index] = arr->arr[last];
}
|
2.3.总结
3.内存分配
3.1.容量和个数
1
2
3
4
5
6
7
|
void
ccArrayEnsureExtraCapacity(ccArray *arr, unsigned
int
extra)
//确保有额外的空间
{
while
(arr->max < arr->num + extra)
//判断空间是否足够
{
ccArrayDoubleCapacity(arr);
//增加一倍空间
}
}
|
3.2.判等
4.效率
5.CCARRAY_FOREACH和CCARRAY_FOREACH_REVERSE
1
2
3
4
5
6
7
8
9
10
11
|
#define CCARRAY_FOREACH(__array__, __object__) \
if
((__array__) && (__array__)->data->num > 0) \
for
(CCObject** __arr__ = (__array__)->data->arr, **__end__ = (__array__)->data->arr + (__array__)->data->num-1; \
__arr__ <= __end__ && (((__object__) = *__arr__) != NULL
/* || true*/
); \
__arr__++)
#define CCARRAY_FOREACH_REVERSE(__array__, __object__) \
if
((__array__) && (__array__)->data->num > 0) \
for
(CCObject** __arr__ = (__array__)->data->arr + (__array__)->data->num-1, **__end__ = (__array__)->data->arr; \
__arr__ >= __end__ && (((__object__) = *__arr__) != NULL
/* || true*/
); \
__arr__--)
|