我是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中似乎“静态”'不存在'。
答案 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生成器 - 您可能希望确保您所做的是线程安全的。 (那是另一个故事。)