cocos2d-x 内存管理理解 总结

本文解析了Cocos2d-x引擎的内存管理机制,重点介绍了对象新建后的autorelease()调用流程、系统如何自动释放对象以及retain()和release()的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文将主要进行对现在流行的cocos2d-x引擎的内存管理机制,进行一些总结,由于是刚刚接触cocos2d,并且本文是自己的整个cocos2d内存管理的自我的理解,难免有错,请各位看官斧正或交流,一起提高。

本文将不在进行跟踪源码了,因为网上已经有很多相关的分析,比如Cocos2d-x内存管理都是不错的讲解。

我将通过下面三个过程,进行说明我的理解

  •  对象新建和调用autorelease()的对象内部变化
  • 而后是当我们调用autorelease后,系统在背地里做了什么
  • 我对于使用autorelease(),restain()的使用方式的理解

一:调用autorelease()函数

一般我们调用autorelease的情况都是
CCSprite * p = new CCSprite();
p->autorelease();
是不?上面这段代码第一句代码干了什么的干活?首先是通过新建对象CCSprite,父类CCObject的初始化将该对象的m_reference赋值为1。而后调用autorelease()函数就会将这个对象加入到AutoReleasePool这个数组中存放起来,并且将CCSprite的m_autoreleasecount(自动释放次数) 加1.


二:系统鬼鬼祟祟做什么?

当我们调用了autorelease()函数之后,系统背地里帮我干了什么?其实当你看过源码之后,你会知道在Director类中的主循环函数main_loop().函数中有一句话

     // release the objects
     CCPoolManager::sharedPoolManager()->pop();        
表示在每执行一帧之后,Director都会将AutoReleasePool的数据清空,让pool中的元素调用release方法。这样就将我们不需要的元素给释放掉了。

三:对于使用autorelease(), retain(), release()函数使用情况的理解

对于这个的理解,我觉的:
release():这个函数很简单,就是首先判定对象的m_reference是否为1,如果为1,那么将其delete掉。

autorelease()的使用情况,就是在我们创建了一个对象,对于这个对象我们不需要知道它什么时候消亡,因为我在其他地方都不会使用它(所以我觉得,如果已经知道以后不会再使用它了,直接进行release就行了,但是系统给我们提供了,这个方法,不要我们去手动的调用release函数)

retain():对于这个函数就只有在,我们创建完之后调用了autorelease函数才有。通过autorelease函数我们知道,当Director在main_loop中清空所有autoreleasePool中加入的对象的时候,调用的release函数,所以当我们函数m_referce==1,则该对象会被delete掉。那么我们要怎样避免对象被系统,悄悄的释放掉。我们就要显示的修改m_reference让它们大于1。这样系统执行autoreleasePool清空的时候,只是将release--;


因为我也是刚刚接触有什么错误的确实不能避免,希望给我能够给我指出,共同学习进步啊,谢谢




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值