重开发人员的劳动成果,转载的时候请务必注明出处: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. 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念

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

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

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

  3. 1、Cocos2dx 3.0游戏开发找小三之前言篇

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

  4. 3、Cocos2dx 3.0游戏开发找小三之搭建开发环境

    尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27107295 搭建开发环境 使用 Cocos2d- ...

  5. 12、Cocos2dx 3.0游戏开发找小三之3.0中的生命周期分析

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706303 生命周期分析 在前面文章中我们执行了第 ...

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

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

  7. 23、Cocos2dx 3.0游戏开发找小三之粒子系统:你那里下雪了吗?

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30485919 春雨惊春清谷天,夏满芒夏暑相连, 秋处 ...

  8. 19、Cocos2dx 3.0游戏开发找小三之Action:流动的水没有形状,漂流的风找不到踪迹、、、

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478985 流动的水没有形状.漂流的风找不到踪迹. ...

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

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

随机推荐

  1. String、StringBuffer与StringBuilder差分

    的位置不言而喻.那么他们究竟有什么优缺点,究竟什么时候该用谁呢?以下我们从以下几点说明一下 1.三者在运行速度方面的比較:StringBuilder >  StringBuffer  >  ...

  2. VMware vSphere服务器虚拟化实验十一高可用性之三Fault Tolerance

                                                                VMware vSphere服务器虚拟化实验十一高可用性之三Fault Tole ...

  3. LeetCode总结 -- 树的性质篇

    树的性质推断是树的数据结构比較主要的操作,一般考到都属于非常easy的题目,也就是第一道入门题.面试中最好不能有问题,力求一遍写对.不要给面试官不论什么挑刺机会.LeetCode中关于树的性质有下面题 ...

  4. WASP_百度百科

    WASP_百度百科 WASP

  5. OpenStack 中的neutron-server启动过程

    neutron-server是neutron的核心组件之中的一个.负责直接接收外部请求,然后调用后端对应plugin进行处理. 其核心启动过程代码主要在neutron.server包中. __init ...

  6. tomcat dbcp 基于jndi当配置java.sql.SQLException: Already closed

    最近发现了一个现象,观察到的生产环境,不要有一段时间操作,然后另一个操作,首先将有一个数据库连接:java.sql.SQLException: Already closed.,例如下列: error ...

  7. PCB板蛇形走线有什么作用

    PCB板蛇形走线有什么作用  PCB上的不论什么一条走线在通过高频信号的情况下都会对该信号造成时延时,蛇形走线的主要作用是补偿"同一组相关"信号线中延时较小的部分,这些部分一般是没 ...

  8. 关于SSIS批量抽取Excel文件报0x80004005错误的解决办法

    原文:关于SSIS批量抽取Excel文件报0x80004005错误的解决办法 标题: Microsoft Visual Studio ------------------------------ Pa ...

  9. linux下无ifconfig命令

    你不是用root用户运行此命令的吧?这样试试看:$ su - password: 输入root用户口令# ifconfig   还是没有的   用whereis命令找找看:# whereis ifco ...

  10. dede 首页或列表页调用文章内容页body内容

    在使用dede过程,有的朋友会调调出文章的列表的内容出来,怎么调呢?当然是用dede的传参的数据查询语句了,方法如下: {dede:arclist flag=h typeid=2 row=1 titl ...