您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x学习笔记内存管理之autorelease

2013-07-22 13:14 225 查看

转自:http://hi.baidu.com/357802636/item/7bb3e71a7838efd6be904200

刚开始接触cocos2d-x的时候最让我头疼的就是内存管理,经常写着写着代码心里就开始没谱了,总是在问自己:“这样子会不会有内存泄漏、这个对象能得到释放吗”,类似的情况已经不是一次两次出现了。现在终于对这些问题有了更清晰的认识,就autorelease()做一下总结。

先从CCObject的autorelease方法入手,代码如下:

在这里,当程序执行第4行之前,监视this对象,发现他的应用计数是 1 ,执行完成第4行代码之后应用计数还是 1 。这让我想起很多addObject接口,里面都会对传进去的对象做 retain 操作,这里内存池中难道没有做 retain 操作吗,还是里面retain之后将传进去的对象释放掉了。研究一下内存管理的代码"CCAutoreleasePool.h":

现在知道CCObject中的autorelease其实是将自己通过自动释放池管理者 CCPoolManager 添加到其当前的自动释放池 m_pCurReleasePool 中去了,再看看自动释放池管理者以及 自动释放池的实现 "CCAutoreleasePool.cpp":

自动释放池管理者通过pop方法,将当前自动释放池中的所有对象调用release方法进行释放,pop方法是什么时候在什么地方进行调用的呢,在导演类CCDirector的实现中有这样的一段代码:

在每一帧绘制完成之后,当前的自动释放池将会被清理,所有调用了autorelease操作的对象都会被调用release方法,减少其引用计数。如果我们创建的对象调用了autorelease,那么在稍后帧绘制之后,自动释放池被清理的时候此对象的引用计数将被减1,此对象如果没有在其他地方被

retain,那么它将会被释放掉。

在对象的使用上,为保证对象能被正确的释放,需要时刻知道此对象的引用计数为多少,但是很多时候能做到这点很难,除非对所有的接口都很了解,知道其中是否对当前对象做了retain操作或者release操作,如果做不到这点,可以按照cocos2d-x框架中这样的原则去做

1、作为参数传进来的对象,如果你要长期的使用或者管理它,请 retain,不用的时候记得release

2、作为参数传进来的对象,他不是你创建或者retain的,如果你不确定他从哪里来,外面是否知道你会release掉他,请别随便调用release

3、如果你撇开自动释放池,new了一个对象而不调用autorelease,在不使用的时候直接将对象delete掉,这样的做法是很不安全的,除非你创建的对象真的只有你在使用而没有被其他对象retain。但并非代表你不能自己new和delete管理对象,因时而异。

4、创建一个新的对象,调用了对象的autorelease方法,如果想长期的使用他,请使用retain方法(包括addChild到自身,addObject到某个

CCArray中),清除时使用release方法(removeChild、CCArray的removeObject等)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: