使用静态变量引用Objective C中的类的实例?

时间:2014-07-14 22:20:56

标签: ios objective-c

我是Objective C的新手,这可能是一个蹩脚的问题,但是:

我正在尝试创建一个iOS游戏,其中有一个类'怪物'每秒钟左右生成一个新的怪物实例,我希望能够跟踪每个怪物以便使用/以某种方式操纵它。

目前我正在尝试为每个Monster发布一个唯一的ID,

例如:

//Incorrect Syntax ... 
Class Monster extends CCSprite

    public static global_id = 0;
    public instance_id;

    init() {
           instance_id = global_id;
           global_id ++;
    }

我如何在Monster类的头文件/实现文件中管理它? 在Objective-C中似乎“静态”'不存在'。

2 个答案:

答案 0 :(得分:3)

您通常可以通过以下方式解决问题:

  • 坚持每个源代码一个文件规则;
  • 在该文件中放置合适的全局变量;
  • 将全局变量标记为static,在C术语中表示“无法从此编译单元外部访问”(并且如果您不使用,则一个源文件是一个编译单元预处理器)。

所以,界面:

@interface AEMonster: CCSprite
@property (nonatomic, readonly) int instanceID;
@end

实现:

static int globalID = 0;

@implementation AEMonster

- (instancetype)init
{
    self = [super init];

    if(self)
    {
        _instanceID = globalID;
        globalID ++;
    }

    return self;
}

@end

答案 1 :(得分:2)

您的示例看起来不像纯Objective-C。 Objective-C支持静态定义。您所描述的是经典的Factory / Singleton模式,它看起来像这样:

MyClass.h:

@interface MyClass : NSObject

+ (id)getInstance;

@end

MyClass.m:

#import "MyClass.h"

+ (id) getInstance
{
    static MyClass *myClass = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        myClass = [[self alloc] init];
    });

    return myClass;
}

这是模式的单例部分,您可以在其中调用MyClass *c = [MyClass getInstance];来获取对实例的引用。只有一个实例将存在,这对于你想要一些半全局但具有更好模式的东西非常有用(网络服务就是很好的例子)。

工厂模式只是一个步骤。您以完全相同的方式构建MyClass,但是您将使用createMonster()方法而不是getInstance()方法。这将需要创建你想要的怪物类型所需的任何参数(当你有一个怪物基类然后是特定怪物类型的子类时,这个模式特别有用。)

这就是您要生成唯一ID的位置。只需在工厂函数中添加另一个静态成员变量,每次调用它时都可以增加它。不过,这是一个非常天真的唯一ID生成器 - 您可能希望确保您所做的是线程安全的。 (那是另一个故事。)