可以说这种方法使用还是比较广泛,之前在读android源码时也发现是使用这种方法。其原理理解下来就是在系统的基类中添加一个引用变量,当继承该基类的实例被开辟时,则引用计数变量+1,当释放时如果引用计数-1等于零时,说明该对象生命周期结束,可以安全释放资源。
书中提到,该方法的优点:维护引用计数比维护生命周期信息轻松很多,将new和delete转换成了使用和使用结束的事件。
缺点:堆碎片和管理烦琐依然存在。
最有名的垃圾回收机制应该就是Java中的垃圾回收。
优点:将程序员从复杂的内存管理中全完解放,防止内存泄露,有效的使用内存
缺点:通常作为一个单独的低级别线程运行,不能手动指派垃圾回收器回收某个对象,也就是说缺少灵活性。
Cocos2d-x来源于Cocos2d-iphone,所以与objective-c一样,也采用引用计数和自动回收的机制。
Cocos2d-x的根类为CCObject,所有类都派生于该类。在该类中实现了引用计数机制,实现了几个比较重要的API:
unsigned int retainCount(void) ; //获取当前引用计数的值 void retain(void); // 引用计数值+1 void release(void); // 引用计数值-1 CCObject *autorelease(void); // 将对象放入自动回收池
1. 可以手动创建和释放
2. 可以嵌套
3. 当回收池自身被释放时,对池中所有对象执行一次release()方法
4. 引擎在每次游戏循环开始前会建立一个回收池,并在每一帧结束时,池中对象也都会执行一次release()方法
所以说当执行autorelease()方法时,并不会像release()方法一样马上将引用计数值-1,而是和该对象执行autorelease后所加入的回收池的生命周期密切相关。
CCPoolManager::sharedPoolManager()->push(); //push一个回收池,也可以说是添加一个回收池 .......... // 各种创建对象后调用autorelease方法 CCPoolManager::sharedPoolManager()->pop() // 销毁刚才调用push方法创建的回收池,因为是栈类型,也只能销毁最近一次调用push方法创建的回收池。此外也销毁所以池中对象,也就是那些在push与pop之间调用autorelease的对象。
优点:在有些时候无法直接调用release释放,如在工厂模式中,此时非常适合使用autorelease
缺点:
1. 池中对象过多会导致资源紧张
2. 如autorelease时出现错误则难以调试
所以尽量使用release方法而在一些必要时候才使用autorelease方法
1. 对象传值时,应考虑新旧对象相同的特殊情况
2. 工厂方法返回前,应调用autorelease方法
Cocos2d-x提供内存相关的一些宏在"platform/CCPlatformMacros.h"中:
仅举例两个应该是常用的:
CC_SAFE_RELEASE(p);// 释放p对象,如果已经为null则不做处理
CC_SAFE_RELEASE_NULL(p);// 释放p对象,释放后至为null,如果已经为null也不做处理
原文:http://blog.csdn.net/xudongdong99/article/details/19367021