9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值
来源:互联网 发布:仿网红淘宝店铺 编辑:程序博客网 时间:2024/06/03 23:44
重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153
工厂方法模式
工厂方法是程序设计中一个经典的设计模式,指的是基类中只定义创建对象的接口,将实际的实现推迟到子类中。
在这里,我们将它稍加推广,泛指一切生成并返回一个对象的静态函数。
一个经典的工厂方法如同这样:
Sprite* factoryMethod() {Sprite* ret = new Sprite();//在这里对 ret 对象进行必要的初始化操作return ret; }
这段看起来正常的代码其实隐藏着一个问题:
工厂方法对 ret 对象的引用在函数返回时已经结束,但是它没有释放对 ret的引用,埋下了内存泄露的隐患。
但是,如果在函数返回前就执行 release(),这显然是不合适的,
因为这会触发对象的回收,再返回的对象指针就成为了错误指针。
autorelease()方法很好地解决了这个问题。
此函数结束时我们已经丧失了对 ret 的引用,为了把 ret 对象传递给接受者,需要对它进行一次 autorelease 操作,这是因为虽然我们调用了 autorelease 方法,
但是对象直到自动回收池释放之前是不会被真正释放掉的(通常 Cocos2d-x 会在每一帧之间释放一次自动回收池),调用者有足够的时间来对它进行 retain 操作以便接管 ret 对象的引用权。
因此,Cocos2d-x 的执行机制很巧妙地保证了回收池中的对象不会在使用完毕前释放。
利用autorelease()修改后的工厂方法如下:
Sprite* factoryMethod() {Sprite* ret = new Sprite();//在这里对 ret 对象进行必要的初始化操作ret->autorelease();return ret; }
调用者需要在使用完毕后谨慎地释放对象;
使用工厂方法创建对象时,虽然引用计数也为 1,但是由于对象已经被放入了回收池,
因此调用者没有对该对象的引用权,除非我们人为地调用了 retain()来获取引用权,
否则,不需要主动释放对象
关于对象传值
将一个对象赋值给某一指针作为引用的时候,为了遵循内存管理的原则,
我们需要获得新对象的引用权,释放旧对象的引用权。
此时,release()和 retain()的顺序是尤为重要的。
首先来看下面一段代码:
void SomeClass::setRef(Ref* other) {this->object->release();other->retain();this->object = other;}
这里存在的隐患是,当 other 和 object 实际上指向同一个对象时,第一个 release()可能会触发该对象的回收,这显然不是我们想看到的局面,所以应该先执行 retain()来保证 other 对象有效,然后再释放旧对象:
void SomeClass::setRef(Ref* other) {other->retain();this->object->release();this->object = other;}
其他可行的解决方案也有很多:
例如使用 autorelease()方法来代替 release()方法,或在赋值前判断两个对象是否相同。
在 Google 的 Objective-C 编程规范中,推荐使用 autorelease()方法代替 release()方法。
注意,只有两种情况你才需要调用release()方法:
(1)你new一个cocos2d::Ref子类的对象,例如CCSprite,CCLayer等。
(2)你得到coccos2d::Ref子类对象的指针,然后在你的代码中调用过retain方法。
郝萌主友情提示:
指针不是你想release就能release!!
- 9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值
- 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念
- 3、Cocos2dx 3.0游戏开发找小三之搭建开发环境
- Cocos2dx 3.0游戏开发找小三之搭建开发环境
- 11、Cocos2dx 3.0游戏开发找小三之3.0中的内存释放心法与辅助宏
- 21、Cocos2dx 3.0游戏开发找小三之Cocos2d-x中的动画与场景特效
- 设计模式之工厂方法模式与抽象工厂模式
- 设计模式之工厂方法模式与抽象工厂模式
- 《JAVA与模式》之工厂方法模式
- 《JAVA与模式》之工厂方法模式
- 《JAVA与模式》之工厂方法模式
- 《JAVA与模式》之工厂方法模式
- 《JAVA与模式》之工厂方法模式
- 《JAVA与模式》之工厂方法模式
- 《JAVA与模式》之工厂方法模式
- 《JAVA与模式》之工厂方法模式
- 《JAVA与模式》之工厂方法模式
- 《JAVA与模式》之工厂方法模式
- 大数据之“用户行为分析”
- poj1833-排列
- 【Flume NG用户指南】(0)介绍
- word分栏对齐方法
- 哇!板球 源码分析二
- 9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值
- Python正则表达式指南
- Java面向对象 集合(中)
- Java笔试之按字节截取字符串
- Cygwin安装以及以root身份登录
- 缺失静态库bug
- 点类的实现(V1.0版)
- Spring MVC + Mybatis 整合实例
- intellij idea weblogic 下面 怎么远程断点