Cocos2d | Arc Enabled - 创建一个管理其余层的 Singleton BaseLayer
Posted
技术标签:
【中文标题】Cocos2d | Arc Enabled - 创建一个管理其余层的 Singleton BaseLayer【英文标题】:Cocos2d | Arc Enabled - Create a Singleton BaseLayer which manages the rest of the layers 【发布时间】:2014-08-16 16:18:28 【问题描述】:希望一切都好。我在这里有一个稍微复杂且令人难以置信的问题,并且迫切需要您的帮助。我正在尝试在已经建立的基于 ARC 的应用程序中设置一个 Cocos2d 2.x 环境,该应用程序为第三方库提供娱乐,因此一些类启用了 ARC,而另一些类(如 Cocos2d 类)则没有。无论如何,幸运的是 Cocos2d 可以正常工作,但就像我以前禁用的 ARC 游戏环境一样,此代码不支持 SynthesizeSingleton.h,这是我非常喜欢的一个类。相反,我做了一些研究并掌握了许多启用 ARC 的单例解决方案,其中一个在 this post 中进行了描述。
无论如何,我需要向你解释一下我是如何管理我的游戏环境的。就像 Apple 强烈推荐的那样,MVC 模式将我的模型与视图分开,控制有助于连接一切。同样,所有视图都是从一个包含 BaseLayer 的主场景处理的。所有其他层都是这个 BaseLayer 的子层,它本身是一个单例,因此管理所有其他层,即我有我唯一的奇异场景,它添加一个 BaseLayer,BaseLayer 根据它们的 Z-Index 添加所有其他层或如果不需要,则销毁它们。在我所有未启用 ARC 的项目中,这工作正常,但不知何故 dispatch_once_t 不会执行一次,但总是因此实例被重置并且单例无法像承诺的那样执行。我该怎么办? :(
【问题讨论】:
【参考方案1】:出于某种原因,这个项目和第 8 章中 source code 中的 GameScene 帮助我产生了一个非常简单但不那么整洁的解决方案:
最简单的解决方案是:
static MyBaseLayer *sharedMyBaseLayer = nil;
紧随其后,
+ (MyBaseLayer*)sharedMyBaseLayer
NSAssert(sharedMyBaseLayer != nil, @"BaseLayer instance not yet initialised!");
return sharedMyBaseLayer;
然后使用场景初始化设置sharedMyBaseLayer实例的层:
+(CCScene *) scene
CCScene *scene = [CCScene node];
// 'layer' is an autorelease object.
MyBaseLayer *layer = [MyBaseLayer node];
// add layer as a child to scene
[scene addChild: layer];
// return the scene
return scene;
-(id)init
if(self = [super init])
sharedMyBaseLayer = self;
return self;
这给了我一个美丽的单例实例,它永远不会重新启动并且很好地服务于我的目的。无论多线程有多么缺陷,它对我来说都很好。如果有任何其他想法出现,请及时更新我。
【讨论】:
【参考方案2】:我不明白你的单例的目的,但你像这样创建它们(没有全局静态变量):
+ (id)sharedManager
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
sharedMyManager = [[self alloc] init];
);
return sharedMyManager;
dispatch_once 是线程安全的。我觉得你想多了。我真的不明白单例与 MVC 有什么关系,或者你为什么要尝试做你的 OP 所说的。
MVC 的重点是拥有数据(模型)、视图(表示)和控制器(将它们联系在一起的粘合剂),以便您可以进行大量代码重用。 cocos2d 不是围绕这个构建的,但即使你想这样做,singleton 也与此无关。
您仍然可以以非 cocos2d 特定方式重用的方式分离模型数据和逻辑,但我不知道全局层如何实现这一点。
【讨论】:
以上是关于Cocos2d | Arc Enabled - 创建一个管理其余层的 Singleton BaseLayer的主要内容,如果未能解决你的问题,请参考以下文章