0

我决定重写我一直在用 Objective-C 开发的基于 java 的游戏原型。iOS平台将更适合。

不幸的是,我不得不同时学习 Obj-C。在 Java 游戏中,有一些库由主游戏类实例化,并在需要时静态访问。这意味着我每次都可以承担新实例的开销。

IE:

Game.getRNG().nextInt()或者Game.getNoiseGen().noise( x, y )

我试图了解在 Obj-C 中复制它的最佳方法。我查看了单例示例并正在尝试这种方法,但我不确定这是否是最好的方法。

上面的代码,显然会转化为:

[[[Game getInstance] getNoiseGen] noise]

有没有更好的方法来创建库类的单个实例并从我的应用程序代码中的任何位置静态引用它们?

4

2 回答 2

0

如果我正确理解了您的 Java 模型,那么您没有理由不能将其直接翻译成 Objective-C,这当然具有您熟悉它的优势——在您学习一门新语言时很有帮助。

通过“主游戏类实例化了一些库,并在需要时静态访问”,我认为:

  1. 主类声明了适当类型的全局变量并对其进行了初始化;或者
  2. 类本身有一个全局变量,它保存对它们自身实例的引用。

您不会在这里生成“单例”,而只是要共享的对象。还鉴于您的主要课程创建了它们,它们始终存在。结合这意味着您无需使用任何“单例”方案,这些方案将创建延迟到第一次使用并处理一次性线程安全初始化。

你所需要的只是 Objective-C 中全局变量的模型。概括地说,这是:

  1. extern在头文件中声明变量
  2. 在实现文件中定义变量

概括地说,您的MainGame.h

#import "SharedGameObject.h"

@interface MainGame : NSObject

extern SharedGameObject *TheSharedGameObject;
...
@end

MainGame.m

#import "MainGame.h"

SharedGameObject *TheSharedGameObject;

- (id) init
{
   TheSharedGameObject = [SharedGameObject new];
   ...
}

现在,所有其他导入MainGame.h的类都可以使用TheSharedGameObject. 这是 Apple 使用的模型NSApplication,它关联了NSApp全局变量。

高温高压

于 2013-06-17T19:41:00.480 回答
0

要创建单例,请确保您只创建一次静态实例,您可以使用 GCD 来执行此操作。

+ (id)sharedInstance;
{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

然后你可以:

Game *game = [Game sharedInstance];
//... 
CGPoint point = CGPointMake(x, y);
[[game noiseGen] noise:point]
//...

单例被认为是一种反模式,应尽可能避免。

仅从您的示例来看,您也违反了Demeter 法则,可能值得一读,看看您是否可以在那里改进。

于 2013-06-17T19:26:27.553 回答