zoukankan      html  css  js  c++  java
  • CCArray(转)

    http://blog.csdn.net/passtome/article/details/7966451

    CCArray也是cocos2d-x自己写的类。它相当于是objc的NSArray。在cocos2d-x中是没有NSArray的概念的(NSArray和NSMutableArray的唯一区别就是一个不可以改变数组中含有的对象,另一个可以改变)。但是CCArray也有一个小问题。首先,CCArray是不能使用new的方式创建的。其次,使用CCArray::array()创建的数组,即使这个数组已经是当前类的成员变量,也必须要做一次retain,否则的话在创建数组的函数返回的时候,CCArray就会被直接释放掉了。由于这个问题也无法通过编译时候暴露出来,而且在objc中创建自动释放的NSArray类型的成员变量的时候是不需要retain的,所以当我从objc转为使用cocos2d-x的时候,经常会忘记做retain,多次导致了程序在其他函数中使用该成员变量的时候出现错误。

    初始化
        CCArray *tmpArray = CCArray::array();
        tmpArray->retain();

    增加元素
    tmpArray>addObject(元素);

    删除
        tmpArray->removeAllObjects();
        tmpArray->release(); 
    不是因为cocos2d-x引用计数设计的有问题,而是因为cocos2d-x的autorelease机制和cocoa的NSAutorelease有很大区别,没搞清楚就会出现疑问。
    cocos2d-x里,所有autorelease的对象只能在一个event loop里保持有效,也就是一次渲染frame,当每帧渲染结束时,pool manager会对他管理的每个autorelease的对象做一次release()调用,cocos2d-x里的代码很明确:
    void CCDisplayLinkDirector::mainLoop(void)
    {
        ...
             // release the objects
             CCPoolManager::sharedPoolManager()->pop();        
         ...
    }

    void CCPoolManager::pop()
    {
        ...
        m_pCurReleasePool->clear();
        ...

    使用CCArray注意事项

    CCArray一般不会被添加到其他的类中,所以其引用计数为1,并且被设置为autorelease

    所以,创建的CCArray对象一定要retain,并在其析构方法中调用release释放内存

    CCObject *object = NULL;
    count++; CCARRAY_FOREACH(array,
    object) { CHECK_GL_ERROR_DEBUG(); ccPointSize(1); ccDrawColor4B(0,255,255 ,255); ccDrawRect( CCPointMake(0, 0), CCPointMake(50 + count, 50 + count)); }
  • 相关阅读:
    导入别人的flex项目出现的问题
    HTTP通信原理
    java 代码的细节优化
    跨服务器之间的session共享
    spring整合hibernate配置文件
    java中时间类型的问题
    Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长:
    并发处理方案 个人总结
    MsSqlserver 查看锁表与解锁
    c# CTS 基础数据类型笔记
  • 原文地址:https://www.cnblogs.com/yuan19/p/3286814.html
Copyright © 2011-2022 走看看