重开发人员的劳动成果,转载的时候请务必注明出处: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. iOS 最新UIAlertController

    iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController 在实现视图控制器间的过渡动画效果和自适应设备尺 ...

  2. HDU 1069 monkey an banana DP LIS

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64uDescription 一组研究人员正在 ...

  3. c++,命名空间(namespace)

    1.什么是命名空间: 命名空间:实际上就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来. 2.命名空间 ...

  4. Java 重入锁 ReentrantLock

    本篇博客是转过来的. 但是略有改动感谢 http://my.oschina.net/noahxiao/blog/101558 摘要 从使用场景的角度出发来介绍对ReentrantLock的使用,相对来 ...

  5. USACO Money Systems Dp 01背包

    一道经典的Dp..01背包 定义dp[i] 为需要构造的数字为i 的所有方法数 一开始的时候是这么想的 for(i = 1; i <= N; ++i){ for(j = 1; j <= V ...

  6. redis(四)redis与Mybatis的无缝整合让MyBatis透明的管理缓存

    redis的安装 http://liuyieyer.iteye.com/blog/2078093 redis的主从高可用  http://liuyieyer.iteye.com/blog/207809 ...

  7. 提高mysql查询效率的六种方法

    1,表设计一定要优化,冗余数据最少,少用连接查询.如果在实际应用中,使用了极其复杂的连接,子查询,则数据表的设计得要重新考虑了. 2,尽量用char而不是varchar,因为固定长度得string用起 ...

  8. oracle scn浅析

    1. 系统SCN号 查询系统SCN号的方法: select dbms_flashback.get_system_change_number from dual commit后系统SCN号会增长,但是即 ...

  9. 【一】仿微信飞机大战cocos2d-x3.0rc1

    參考 [偶尔e网事] 的 [cocos2d-x入门实战]微信飞机大战  cocos2dx 2.0版本号,偶尔e网事他写的很具体,面面俱到,大家很有必要看下.能够通过以下链接跳转: cocos2d-x入 ...

  10. libevent: linux安装libevent

    http://libevent.org/上下载最新的libevent, 如 libevent-2.0.22-stable.tar.gz. 然后解压,按照README里面的步骤安装.