一、基于Objective-C的内存管理方式;
二、过于零散的对象分配回收可能导致堆中的内存碎片化;
三、主要两种实现智能管理内存的技术:引用计数和垃圾回收。引用计数通过每个对象维护自身的一个引用计数去记录该对象当前被引用的次数,当引用计数为0时,标识着该对象的生命周期结束,自动触发对象的回收释放,可有效解决内存释放问题,但依然存在堆碎片化和管理繁琐的问题;垃圾回收:一种自动的内存回收器,自动跟踪每一个对象的所有应用,在不可预知的情况下对内存堆中已经死亡的或者长时间没有使用过的对象进行清除和回收,程序员不能手动指派垃圾回收其回收谋个对象。cocos2d-x使用引用计数方法。
四、方法autorelease(),其作用是将对象放入自动回收池CCAutoreleasePool。当回收池自身被释放的时候,它就会对池中的所有对象执行一次release()方法。引擎在每次游戏循环开始之前会创建一个回收池,在循环结束后释放回收池。因此,即使没有手工创建和释放回收池,每一帧结束的时候,自动回收池中的对象也都会被执行一次release()方法。调用了autorelease()方法的对象将会在自动回收池释放的时候被释放一次。自动回收池是可以嵌套的。多个自动回收池排列成栈结构,当手动创建了回收池之后,回收池会压入栈的顶端,autorelease对象仅添加到顶端的回收池中。当顶层的回收池被弹出释放时,它内部所有的对象都会被释放一次,此后出现的autorelease()对象则会添加到下一个池中。
五、通常,cocos2d-x会在每一帧之间释放一次自动回收池;
六、autorelease方法是将对象标识为在每一帧之间释放release()一次对象的引用,即引用计数减1。只有对象的引用计数为0时,对象才会自动释放掉。所以要确保的是对象的引用计数准确。当调用retain()来获取对象的引用权时,需要手动去release对象的引用。
七、autorelease()的垃圾池机制同样地需要占用内存和cpu资源,每次执行rutorelease()的过程,实际上对应的是执行成对的retain()和release(),以及一次成对的容器存取,爱包括其他的逻辑判断。过多不必要的autorelease()将导致垃圾池膨胀,占用很大内存。