cocos2d-x中的CCArray

本文介绍了Cocos2d-x中的CCArray属性,并探讨了如何使用预编译方法进行操作。特别指出,不能使用CCARRAY_FOREACH在遍历过程中删除元素,因为会导致删除不彻底。建议使用CCARRAY_FOREACH_REVERSE进行安全的反向遍历和删除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来认识下CCArray的属性:

    /** 创建一个数组 */
    static CCArray* create();
    /** 通过一些对象创建一个数组 */
    static CCArray* create(CCObject* pObject, ...);
    /** 创建一个数组,并将对象放进去 */
    static CCArray* createWithObject(CCObject* pObject);
    /** 创建一个数组,设定估计容量 */
    static CCArray* createWithCapacity(unsigned int capacity);
    /** 同一个一个数组创建一个数组 */
    static CCArray* createWithArray(CCArray* otherArray);
    /**
     @brief   通过文件导入一个数组
     @param   pFileName  一个*.plist格式的文件
     @return  返回CCArray数组指针
     */
    static CCArray* createWithContentsOfFile(const char* pFileName);
    
    /*
     @brief 同上, 但是不会调用autorelease, 所以调用之后需要执行release().
     */
    static CCArray* createWithContentsOfFileThreadSafe(const char* pFileName);

    /** 初始化数组 */
    bool init();
    /** 通过一个对象初始化数组 */
    bool initWithObject(CCObject* pObject);
    /** 通过一些对象初始化数组 */
    bool initWithObjects(CCObject* pObject, ...);
    /** 初始化数组,设定估计容量 */
    bool initWithCapacity(unsigned int capacity);
    /** 通过一个数组初始化数组 */
    bool initWithArray(CCArray* otherArray);

    // 查询数组函数

    /** 返回数组元素的数量 */
    unsigned int count() const;
    /** 返回数组的估计容量 */
    unsigned int capacity() const;
    /** 通过对象去获得这个对象在数组中的下标,如果数组中没有这个对象会返回UINT_MAX */
    unsigned int indexOfObject(CCObject* object) const;
    /** 通过一个正确的下标去获得一个元素 */
    CCObject* objectAtIndex(unsigned int index);
    /** 返回最后一个元素 */
    CCObject* lastObject();
    /** 返回一个随机元素 */
    CCObject* randomObject();
    /** 判断数组是否包含该对象 */
    bool containsObject(CCObject* object) const;
    /** 从 1.1 之后,两个数组进行对比 */
    bool isEqualToArray(CCArray* pOtherArray);

    // 添加函数

    /** 添加一个对象 */
    void addObject(CCObject* object);
    /** 添加数组所有元素 */
    void addObjectsFromArray(CCArray* otherArray);
    /** 插入一个对象到一个正确的下标位置 */
    void insertObject(CCObject* object, unsigned int index);

    // 删除函数

    /** 删除最后一个元素 */
    void removeLastObject(bool bReleaseObj = true);
    /** 删掉数组中形参的元素 */
    void removeObject(CCObject* object, bool bReleaseObj = true);
    /** 通过一个正确的下标去删除元素 */
    void removeObjectAtIndex(unsigned int index, bool bReleaseObj = true);
    /** 通过一个数组去删除元素 */
    void removeObjectsInArray(CCArray* otherArray);
    /** 删除所有元素 */
    void removeAllObjects();
    /** 通过一个快速方式去删除元素 */
    //快速方式就是:删除这个元素之后,将最后一个元素填充到删除位置。这样会打乱顺序,慎用
    void fastRemoveObject(CCObject* object);
    /** 通过一个快速方式去删除下标位置的元素 */
    void fastRemoveObjectAtIndex(unsigned int index);

    //  重新安排内容

    /** 交换元素 */
    void exchangeObject(CCObject* object1, CCObject* object2);
    /** 交换制定的两下标的元素 */
    void exchangeObjectAtIndex(unsigned int index1, unsigned int index2);

    /** 用一个对象去替换指定下标的元素 */
    void replaceObjectAtIndex(unsigned int uIndex, CCObject* pObject, bool bReleaseObject = true);

    /** 翻转数组 */
    void reverseObjects();
    /* 缩小数组,让数组占用的内存符合元素的数量 */
    void reduceMemoryFootprint();


下面来介绍CCArrary几个可以用来偷懒的预编译:

#define CCARRAY_FOREACH(__array__, __object__)  //遍历所有元素,后面会举例
#define CCARRAY_FOREACH_REVERSE(__array__, __object__)     //反序遍历元素
#define CCARRAY_VERIFY_TYPE(__array__, __type__)   //判断数组元素是否属于某类对象
#define arrayMakeObjectsPerformSelector(pArray, func, elementType)//让数组中所有元素去执行某一个函数
#define arrayMakeObjectsPerformSelectorWithObject(pArray, func, pObject, elementType)//让数组中所有元素去执行某一个函数 ,带参数

举例:

	CCArray* arr = CCArray::create();

	CCObject* pNode;
	CCARRAY_FOREACH(arr,pNode)
	{
		pNode->retainCount();
		//遍历arr数组,让每一个元素执行retainCount()函数
	}

注意,不能通过CCARRAY_FOREACH去遍历删除元素,会删不干净。

原因:http://blog.youkuaiyun.com/lyh66/article/details/9613055

但是可以通过CCARRAY_FOREACH_REVERSE去遍历删除。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值