重开发人员的劳动成果,转载的时候请务必注明出处: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游戏开发三查找值小工厂方法模式和对象的更多相关文章

  1. 1、Cocos2dx 3.0游戏开发三找一小块前言

    尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 前言 Cocos2d-x 是一个通用 ...

  2. [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面

    cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...

  3. [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动

    cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...

  4. 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...

  5. 9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...

  6. 15、Cocos2dx 3.0游戏开发找小三之Sprite:每一个精灵都是上辈子折翼的天使

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30475395 Sprite  Sprite 能够说是 ...

  7. 10、Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27705613 容器 3.0版本号之前Cocos2d- ...

  8. 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...

  9. 13、Cocos2dx 3.0游戏开发找小三之3.0中的Director :郝萌主,一统江湖

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706967 游戏中的基本元素 在曾经文章中.我们具 ...

随机推荐

  1. 【Oracle】nvl与nvl2对比

    1.nvl(v1,v2),只要v1为null,即将值变为v2. pay(类型):number; 在执行 nvl(pay_type,'null') 函数的时候会提示无效数字,可能是nvl函数会自动将其转 ...

  2. 【Web】throw和throws的区别和用法。

    1.throws关键字通常被应用在声明方法时,用来指定可能抛出的异常.多个异常可以使用逗号隔开.当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象.如下面例子所示: public cl ...

  3. java的数据类型,几个java小程序

    1:求圆的面积 还好看了c++,不然直接看这课件还真是看不懂……加油吧 要从键盘读入数据可以用Scanner类的nextlnt()或者nextDouble()方法,首先创建Scanner类的一个实例, ...

  4. ListActivity的注意点

    有的时候我们需要集成ListActivity,注意点1,这个时候我们的xml中的<ListView>标签中的id属性不能够随便自己命名,而是要固定为android:id="@id ...

  5. 关于QuartusII对ram块的综合

    之前在看Altera的官方教程上就有说明,如果我们定义一个reg [`word_w]user_ram[`word_d]  ; QuartusII会自动综合成为一个ram—— 当然有一些前提:(后续补充 ...

  6. bad interpreter: No such file or directory解决

    执行shell脚本时出现bad interpreter: No such file or directory错误, 一般是因为linux无法识别出Windows的DOS格式,此时只需将文件格式转换成u ...

  7. 用命令行方式关闭linux防火墙

    #/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT #/sbin/iptables -I INPUT -p tcp --dport 22 -j A ...

  8. 关于ActionContext.getContext()的使用方法心得

    这个也是我在另外一位仁兄的博客中看到的,原博客的有点长,我把它精简了一下,算看起来比較方便吧. 为了避免与Servlet API耦合在一起,方便Action类做单元測试,Struts 2对HttpSe ...

  9. ListView优化问题

    可以参考:http://blog.csdn.net/bill_ming/article/details/8817172和http://blog.csdn.net/xiangjai/article/de ...

  10. IOS常用设计模式之委托模式

    对于iOS开发,举例Cocoa框架下的几个设计模式为大家分析.当然,Cocoa框架下关于设计模式的内容远远不止这些,我们选择了常用的几种:单例模式.委托模式.观察者模式.MVC模式. 委托模式 委托模 ...