9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值
重开发人员的劳动成果,转载的时候请务必注明出处: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游戏开发找小三之游戏的基本概念
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...
- 13、Cocos2dx 3.0游戏开发找小三之3.0中的Director :郝萌主,一统江湖
重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706967 游戏中的基本元素 在曾经文章中.我们具 ...
- 1、Cocos2dx 3.0游戏开发找小三之前言篇
尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 前言 Cocos2d-x 是一个通用 ...
- 3、Cocos2dx 3.0游戏开发找小三之搭建开发环境
尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27107295 搭建开发环境 使用 Cocos2d- ...
- 12、Cocos2dx 3.0游戏开发找小三之3.0中的生命周期分析
重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706303 生命周期分析 在前面文章中我们执行了第 ...
- 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...
- 23、Cocos2dx 3.0游戏开发找小三之粒子系统:你那里下雪了吗?
重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30485919 春雨惊春清谷天,夏满芒夏暑相连, 秋处 ...
- 19、Cocos2dx 3.0游戏开发找小三之Action:流动的水没有形状,漂流的风找不到踪迹、、、
重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478985 流动的水没有形状.漂流的风找不到踪迹. ...
- 15、Cocos2dx 3.0游戏开发找小三之Sprite:每一个精灵都是上辈子折翼的天使
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30475395 Sprite Sprite 能够说是 ...
随机推荐
- swfupload组件后台获取中文文件名称乱码的问题解决
问题描写叙述:用swfupload上传文件,含有中文名称的文件上传会报错,我用的是获取FileItem对象,用FileItem对象的getName()方法获取文件名会乱码,试着用request. ...
- android app 架构设计02
二:在开放的过程中,尽量把工具类,BaseActivity 放在指定的位置. DateFormat Bitmap Notification Shared Preference Environment ...
- 破解phpjm.net加密,解密程序,全部公布
原文:破解phpjm.net加密,解密程序,全部公布 2014-05-23更新: 很久没人找我解密了,看来这加密已过时,现公布我这边最新的解密工具. 若有解不出的可联系qq: 267014855 (不 ...
- [Backbone]Make Backbone Better With Extensions
Backbone is becoming wildly popular as a web application development framework. Along with this popu ...
- ASA虚墙配置
asa配置ASA Version 8.0(2) <system>!hostname ASA5520enable password 2KFQnbNIdI.2KYOU encryptedno ...
- 该项目的建设maven片:4.协调和依赖,spring依赖注入demo
源码下载 协调 <groupId>com.demo.animal</groupId> <artifactId>animal-core</artifactId& ...
- 物联网 开发板 基于ESP8266
The ESP8266 The ESP8266 is a highly integrated chip designed for the needs of an increasingly connec ...
- asp.net操作word的表格
近日开发中用户要求实现导出数据为Word,本来想使用html保存为word的实现,但因用户要求样式很高,使用html不好控制,并且导出中包括图片,使用页面导出时图片还是一个路径,不能把图片包括在wor ...
- 自己定义 ViewGroup 支持无限循环翻页之三(响应回调事件)
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处,再次感谢 ################################ ...
- SVN的CheckOut操作和Export操作的区别