【问题标题】:Cocos2d | Arc Enabled - Create a Singleton BaseLayer which manages the rest of the layersCocos2d | Arc Enabled - 创建一个管理其余层的 Singleton BaseLayer
【发布时间】: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 不会执行一次,但总是因此实例被重置并且单例无法像承诺的那样执行。我该怎么办? :(

【问题讨论】:

    标签: ios objective-c cocos2d-iphone singleton automatic-ref-counting


    【解决方案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 特定方式重用的方式分离模型数据和逻辑,但我不知道全局层如何实现这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多