内存管理笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存管理笔记相关的知识,希望对你有一定的参考价值。
目前实现智能管理内存的技术,一是引用计数,一是垃圾回收。
引用计数:是一种很有效的机制,通过给没个对象维护一个引用计数器,记录该对象当前呗引用的次数。当对象增加一次引用时,计数器加1;而对象失去一次引用时,计数器减1;当引用计数为0时,标志着该对象的生命周期结束,自动触发对象的回收释放。引用计数的重要规则是每个程序片段必须负责任地维护引用计数,在需要维持对象生存的程序段的开始和结束分别增加或减少一次引用计数,这样就能实现十分灵活的智能内存管理。
垃圾回收:它通过引用一种自动的内存回收器,试图将程序员从复杂的内存管理任务中完全解放出来。它会自动跟踪每个对象的所有引用,以便找到所有正在使用的对象,然后释放其余不再需要的对象。垃圾回收器还可以压缩使用中的内存,以缩小堆所需要的工作空间。垃圾回收可以防止内存泄漏,有效地使用可用内存。但是,垃圾回收器通常是作为一个单独的低级别的线程运行的,在不可预知的情况下对内存堆中已经死亡的或者长时间没有使用过的对象进行清除和回收,但是程序员不能手动指派垃圾回收器回收某个对象。回收机制包括分代复制垃圾回收、标记垃圾回收和增量垃圾回收。
cocos2d-x的内存管理机制
为了实现对象的引用计数记录,Cocos2d-x实现了自己的根类CCObject。每个对象包含一个用来控制生命周期的引用计数器,就是CCObject的成员变量m_uReference。我们可以通过retainCount()方法获得对象当前的引用计数值,需要引用对象时,调用retain()方法使其引用计数增1;在引用结束时调用release()方法使其引用计数值减1。
CCObject:
1 class CC_DLL CCObject : public CCCopying 2 { 3 public: 4 //对象id,在脚本引擎中使用 5 unsigned int m_uID; 6 //Lua中的引用ID,同样被脚本引擎使用 7 int m_nLuaID; 8 protected: 9 //引用数量 10 unsigned int m_uReference; 11 //标识此对象是否已设置为autorelease 12 bool m_bManaged; 13 public: 14 CCObject(void); 15 virtual ~CCObject(void); 16 void release(void); 17 void retain(void); 18 CCObject* autorelease(void); 19 CCObject* copy(void); 20 bool isSingleRefrence(void); 21 unsigned int retainCount(void); 22 virtual bool isEqual(const CCObject* pObject); 23 virtual void update(ccTime dt) {CC_UNUSED_PARAM(dt);}; 24 friend class CCAutoreleasePool; 25 };
方法autorelease()
其作用是将对象放入自动回收池。当回收池自身呗释放的时候,它就会对池中所有对象执行一次release()方法,实现灵活的垃圾回收。回收池可以手动创建和释放。此外,引擎在每次游戏循环开始之前也会创建一个回收池,在循环结束后释放回收池。
我们可以使用回收池管理器CCPoolManager的push()或pop()方法来创建或释放回收池,CCPoolManager也是一个单例对象。
注意:
程序必须成对执行retain()和release()或者执行autorelease()方法来声明开始和结束对象的引用;
工厂方法返回前,应通过autorelease()结束对该对象的引用;
对象传值时,应考虑新旧对象相同的特殊情况;
尽量使用release()而不是autorelease()来释放对象引用,以确保性能最优;
保存CCObject的子类对象时,应严格使用Cocos2d-x提供的容器,避免使用STL容器,对象必须以指针形式存入。
以上是关于内存管理笔记的主要内容,如果未能解决你的问题,请参考以下文章