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)); }
  • 相关阅读:
    HDU 1874 畅通工程续(dijkstra)
    HDU 2112 HDU Today (map函数,dijkstra最短路径)
    HDU 2680 Choose the best route(dijkstra)
    HDU 2066 一个人的旅行(最短路径,dijkstra)
    关于测评机,编译器,我有些话想说
    测评机的优化问题 时间控制
    CF Round410 D. Mike and distribution
    数字三角形2 (取模)
    CF Round410 C. Mike and gcd problem
    CF Round 423 D. High Load 星图(最优最简构建)
  • 原文地址:https://www.cnblogs.com/yuan19/p/3286814.html
Copyright © 2011-2022 走看看