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游戏开发找小三之工厂方法模式与对象传值,布布扣,bubuko.com

时间: 2024-10-12 13:46:31

9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值的相关文章

14、Cocos2dx 3.0游戏开发找小三之Scene and Layer:一场游戏一场梦

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30474393 Scene :场景 了解了Director 之后,接下来介绍 Scene 这个与它紧密相关的游戏组件. 通过之前的学习,我们已经了解了场景以及它在流程控制中的地位. 在 Cocos2d-x 中,Scene 定义了一个场景.场景只是层的容器,包含了所有需要显示的游戏元素. 因此相对于其他游戏元素,Scene 并没有提供什么特别的功能,就是一

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

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30475395 Sprite Sprite 可以说是游戏中最重要的组成元素: 它描述了游戏中的精灵,是 Node 的一个最重要也最灵活的子类. Sprite 很重要,它代表了游戏中一个最小的可见单位, 同时Sprite 也很灵活,它装载了一个平面纹理,具有丰富的表现力,而且 可以通过多种方式加载. 如果说 Scene 和 Layer 代表了宏观的游戏元素

16、Cocos2dx 3.0游戏开发找小三之Node:父节点、子节点、傻傻分不清楚

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30476133 Cocos2d-x 采用了场景.层.精灵的层次结构来组织游戏元素, 与此同时,这个层次结构还对应了游戏的渲染层次,因此游戏元素可以组织成树形结构,称作渲染树. Cocos2d-x 把渲染树上的每一个游戏元素抽象为一个节点,即 Node. 一切游戏元素都继承自 Node,因此它们 都具有 Node 所提供的特性. Node 定义了一个可绘制

17、Cocos2dx 3.0游戏开发找小三之内置的常用层:三剑客LayerColor、LayerGradient、Menu

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30477587 为了方便游戏开发者,Cocos2d-x 内置了 3 种特殊的 Layer: 具体如下所示: LayerColor:一个单纯的实心色块. LayerGradient:一个色块,但可以设置两种颜色的渐变效果. Menu:十分常用的游戏菜单. LayerColor 与 与 LayerGradient 这两个层十分简单,都仅仅包含一个色块. 不同

18、Cocos2dx 3.0游戏开发找小三之cocos2d-x,请问你是怎么调度的咩

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478251 Cocos2d 的一大特色就是提供了事件驱动的游戏框架, 引擎会在合适的时候调用事件处理函数,我们只需要在函数中添加对各种游戏事件的处理, 就可以完成一个完整的游戏了. 例如,为了实现游戏的动态变化,Cocos2d 提供了两种定时器事件: 为了响应用户输入,Cocos2d 提供了触摸事件和传感器事件: 此外,Cocos2d 还提供了一系列

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

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你习惯快乐时,记忆里的不愉快就消失了. 游戏开始之前 经过之前的学习,我们已经可以开发一个最基本的 Cocos2d-x 游戏了,这个游戏包括一张背景图片和一个退出游戏的按 钮,但是这距离完成一个完整.实用的游戏还很遥远.在这一章节中,我们将首先抛开 Cocos2d,介绍游戏开发的基本概念,然后结合 Co

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

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27705613 容器 3.0版本之前Cocos2d-x 引擎为我们提供了 CCArray. CCDictionary 等 Objective-C 风格的容器: 使用 Cocos2d-x 容器的一个重要原因在于 Cocos2d-x 的内存管理. 一般来说,被存入容器的对象在移除之前都应该保证是有效的, 但值得注意的是,在v3.0 beta版本中加入了数据结

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

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已经多次提到 Cocos2d-x 源自于 Cocos2d-iPhone.Cocos2d-iPhone 是一个十分出色的游戏引擎,许多优秀的 iOS平面游戏都基于 Cocos2d-iPhone 开发,而它的实现语言是 Objective-C.因此,Cocos2d-x 也就沿袭了 Objective-C 的

8、Cocos2dx 3.0游戏开发找小三之3.0版本的内存管理

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十分有限,内存尤为宝贵,开发者必须十分慎重地利用内存,避免不必要的消耗,更要防止内存泄漏. 基于 Cocos2d-iPhone 的 Objective-C风格的内存管理是 Cocos2d-x 的一个特色. 把 Objective-C 的内存管理方式引入 C++,使得游戏开发的内存管理难度下降了个层次.