新手求教:关于Cocos2dX内存管理源码的一些疑问

如下一个Layer :

class HelloWorld: public CCLayer{
private:
CCArray* arr;
public:
HelloWorld(){
arr = 0;
}

    ~HelloWorld(){
        arr-release();
    }

    bool init(){
           if(!CCLayer::init()){
                   return false;
           }
           arr = CCArray::create();
           arr->retain(); //

注释:位置1
CCSprite* s = CCSripte::create(“hello.png”);
addChild(s);
arr->addObject(s);
schduleUpdate();
}

    void update(float dt){
           CCSprite* s = (CCSprite*)arr->objectAtIndex(0);
          s->setPosition(ccp(100, 100));
    }

}

请关注CCArray的指针 arr。

总所周知,“注释:位置1” 这里要调用retain,才能保证在之后的绘图周期里 arr 不被自动释放, 也就是在该图层的生命周期内,update函数里面arr一直可用。

问题如下:

在“位置1” 这里arr调用了retain后,arr 的 m_uReference = 2 ( new出来引用数为1,autorelease 先放入数组 m_uReference=2,然后release了一次 m_uReference=1,再retain m_uReference=2 ),
并且已经被加入到了autoReleasePool里面

在一个绘图周期后,CCPoolManager会调用pop,然后对释放池内所有的对象 release 一次。

那么对于 arr 这个指针,一个周期 release 后 m_uReference = 1;

而中间 arr 没有再被retain

那么再过一个周期,再被pop一次,arr不就被释放掉了吗?????

这就是我不明白的地方,为什么 arr 没有被自动释放?

望大神神神神神神。。。。。。。。们们们们。。。。。不啬赐教!!!!!!!!!!
:870:

无人回复,问题已知,如何结贴?

调用retain后,你得手动调用release,arr才会被释放,cocos2dx采用的是引用计数的方法进行内存管理的.
再一个CCPoolManager 不会直接调用对象的release方法,而是当对象的计数为0时才会调用

那么再过一个周期,再被pop一次,arr不就被释放掉了吗?????

这个理解错了