目前主要有两种实现智能管理内存的技术,一种是引用计数,一种是垃圾回收。Cocos2d-x采用的是引用计数机制。为此实现了自己的根类CCObject,每个对象都包含了一个用来控制生命周期的引用计数器,就是CCObject的成员变量m_uReference。
对于m_uReference,构造函数创建时对该引用计数器赋值为1(自引用,并没有实际的使用),当需要引用对象时调用retain()方法增1,当引用结束的时候调用release()方法减一。而autorelease()方法(create工厂方法迫切需要)会将对象放入自动回收池(CCAutoReleasePool)实现灵活的垃圾回收。当每一帧结束的时候,自动回收池中的对象都会被执行一次release()
autorelease()方法里面代码将该对象添加到自动释放池中:CCPoolManager::sharedPoolManager()->addObject(this);
create方法将对象加入内存池后,对象的所有权已经属于内存池了,我们返回的指针其实是没有所有权的.主循环mainloop干了件非常重要的事情,那就是pop最上层的autorelease pool,此时是在release全部仅仅由此内存池所有的对象. 就是依靠这样的原理,我们可以放心的将对象放在autorelease pool中,知道在需要的时候,这个对象就能正确的释放,同时只要有上层的父节点通过addChild对游戏对象有了所有权以后,又能正确的保证该对象不会被删除.
如果在一帧之内生成了大量的autorelease对象,将会导致回收池性能下降。因此,在生成autorelease对象密集的区域(通常循环中)的前后,我们最好可以手动创建并释放一个回收池。CCAut0m_pReleasePoolStack
CCPoolManager::sharePoolManage()->push()
for(){}
CCPoolManager::sharePoolManage()->pop()
CCAutoreleasePool
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。