cocos2d-x学习笔记内存管理之autorelease
2013-06-14 10:20
302 查看
2012-12-15 11:45
先从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等)
cocos2d-x学习笔记内存管理之autorelease
刚开始接触cocos2d-x的时候最让我头疼的就是内存管理,经常写着写着代码心里就开始没谱了,总是在问自己:“这样子会不会有内存泄漏、这个对象能得到释放吗”,类似的情况已经不是一次两次出现了。现在终于对这些问题有了更清晰的认识,就autorelease()做一下总结。先从CCObject的autorelease方法入手,代码如下:
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等)
相关文章推荐
- cocos2d-x学习笔记内存管理之autorelease
- cocos2d-x学习笔记内存管理之autorelease
- cocos2d-x学习笔记内存管理之autorelease
- Objective-C基础学习笔记(八)-内存管理-autorelease使用-property创建对象的内存管理-循环引用的内管管理
- OC学习笔记六 内存管理(autorelease)
- 黑马程序员--IOS_学习笔记_内存管理_@autorelease
- Cocos2d-x学习笔记(十四)CCAutoreleasePool具体解释
- 黑马程序员----Objective-C学习笔记之autorelease基本使用
- cocos2d-x学习笔记——内存管理
- OC学习笔记之autorelease
- Cocos2d-x学习笔记(十一)-------->Cocos2d-x的内存管理
- ios学习--Objective C内存管理进阶(二):理解autorelease
- cocos2d-x学习笔记18:内存管理01:概述
- 我的Cocos2d-x学习笔记(十二)内存管理
- OC学习笔记四-1 内存管理(Retain-Release)
- iOS学习笔记-错误-ARC forbids explicit message send of autorelease
- 【cocos2d-x 3.x 学习笔记】对象内存管理
- cocos2d-x内存管理机制之autorelease()
- Cocos2d-x学习笔记(四)—— 内存管理
- 黑马程序员---OC学习笔记之autorelease注意及错误用法