剖析iOS开发中Cocos2d-x的内存管理相关操作

2020-01-14 16:38:24王旭

例子: 复制代码
CCObject *obj=new CCObject; 
... 
obj->release(); 
retain是在指针传递和赋值时使用的,他的含义是表示拥有。这经常用在指针赋值上。
原则2:谁retain,谁负责release。
例子:

 

 

复制代码
obj->retain(); 
... 
obj->release();

 

 

 

原则3:传递赋值时,需要先retain形参,后release原指针,最后赋值。(注意,因为这里没有使用自赋值检查,所以这组顺序不能错。)
例子:

复制代码
void CCNode::setGrid(CCGridBase* pGrid) 

            CC_SAFE_RETAIN(pGrid); 
            CC_SAFE_RELEASE(m_pGrid); 
            m_pGrid = pGrid; 

 
3.自动释放池——自动管理内存
 
原则4:对于使用autorelease的对象,不必管它,每帧结束后会自动释放。

 

相关接口:

复制代码
CCObject* CCObject::autorelease(void); 
 
例子:
复制代码
CCObject *obj=new CCOjbect; 
obj->autorelease(); 
... 
完全手动管理内存,很繁琐,cocos2d-x提供了自动释放池CCPoolManager。将对象置于自动释放池中,每帧绘制结束,就自动release池中的对象。

 

 
4.CCNode节点管理

cocos2d-x使用节点组成一棵树,渲染的时候要遍历这棵树。CCNode是所有节点类的父类,他内部使用了一个CCArray对象管理他的所有子节点,当对象被添加为子节点时,实际上是被添加到CCArray对象中,同时会调用这个对象的retain方法。同理,从CCArray中移除时,也会调用release方法。
 
相关接口:

复制代码
virtual void addChild(CCNode * child); 
virtual void addChild(CCNode * child, int zOrder); 
virtual void addChild(CCNode * child, int zOrder, int tag); 
virtual void removeChild(CCNode* child, bool cleanup);