cocos2d-x 内存管理

  • 1.直接使用new关键字创建的对象,引用计数为1,如果没有主动释放它,他就会一直在内存里存在  

CCLayer* pLayer=new CCLayer();


  • 2.使用类的静态函数create创建的对象,引用计数为1,在没有对它进行引用的前提下(引用计数会增加),在当前渲染帧结束时计 数会减一,计数为0销毁对象,无论计数是否大于1,都将会被从自动释放列表里删除  
    也就是说autorelease真正的作用就是在本渲染帧结束时将引用计数减一  

  • 3.下边的两个写法是一样的,你需要销毁的时候需要显式的调用release()函数  

写法1: 

 CCLayer* pLayer=CCLayer::create(); 
 pLayer->retain(); //现在它的引用计数为2,但是到本渲染帧结束时计数就变为1了


写法2:  

CCLayer* pLayer=new CCLayer();  //渲染帧结束前后引用计数都为1


  • 4.什么时候应该用retain? 你用create创建了一个对象,但是它不会马上被引用,你又不想它被销毁,那就得用retain了  

  • 5.什么时候不应该用retain?你用new创建了对象,在渲染帧结束后它仍然存在,你retain的话就多余了,因为你假如retain了,  你需要显式调用两次release才能销毁它  

  • 6.什么时候用new? 你需要创建一个对象但是这个对象并不会马上被使用,或者这个对象需要一直驻留内存  

  • 7.什么时候应该用create?你绝大部分时候都应该用create,你创建了一个对象,它马上(当前帧结束前)会被使用 .用create的优点是你不需要显式的release它了 

总结:
       无论new还是create创建的对象,它在被创建结束后引用计数都变为1了.
       不同的是create创建的对象被添加进了一个列表,在这个列表内的对象在当前渲染结束时 引用计数会自动减一同时把它从列表删除(即使引用计数仍然大于0).
       如果你new了一个对象,那么你必须release它一次(需要驻留内存的除外).
       如果你retain了一个对象N次,那么你需要对应的release它N次.  


         假设将Layer A添加在Scene B上,A上又添加了若干Node 

如果B被delete,内存的释放顺序如下

  1. B的析构函数被调用->B的基类Node的析构函数(这个函数会移除B的所有成员,因此所有成员的引用计数自减1)

  2. A的引用计数为零了,所以A的析构函数被调用->A的基类Node的析构函数

  3. A的成员引用计数为零的自动被析构

  4. 至此所有对象被正确销毁


 
       先到这里吧,能想到的就这些了


你可能感兴趣的:(内存,cocos2dx,retain,cocos2d-x,引用计数)