2011-03-30 52 views
4

我试图找到一个Objective-C相当于Java的任意枚举类型,或“公共静态最后的”对象,如:Objective-C的相应的Java枚举或“静态最后的”对象

public enum MyEnum { 
    private String str; 
    private int val; 
    FOO("foo string", 42), 
    BAR("bar string", 1337); 
    MyEnum(String str, int val) { 
     this.str = str; 
     this.val = val; 
    } 
} 

或者,

public static final MyObject FOO = new MyObject("foo", 42); 

我需要创建为常数(当然),而进口相关的.h文件中,或全球任何地方访问常量。我试过没有成功如下:

了foo.h:

static MyEnumClass* FOO; 

Foo.m:

+ (void)initialize { 
    FOO = [[MyEnumClass alloc] initWithStr:@"foo string" andInt:42]; 
} 

当我做了这一点,并试图用FOO常量,它有strval变量中没有值。我通过使用NSLog调用来验证initialize实际上是被调用的。

另外,即使我在代码的测试块中引用FOO变量,Xcode在上面显示的.h文件中的行中突出显示了注释'FOO' defined but not used

我完全不知所措!谢谢你的帮助!

回答

5

使用extern代替static

foo.h中:

extern MyEnumClass* FOO; 

Foo.m:

MyEnumClass* FOO = nil; // This is the actual instance of FOO that will be shared by anyone who includes "Foo.h". That's what the extern keyword accomplishes. 

+ (void)initialize { 
    if (!FOO) { 
     FOO = [[MyEnumClass alloc] initWithStr:@"foo string" andInt:42]; 
    } 
} 

static意味着该变量是一个单个编译单元内的私人(例如,一个.m文件)。因此,在头文件中使用static将为包含Foo.h的每个.m文件创建私有FOO实例,这不是您想要的。

+1

+1。我会补充一点:你还必须安排调用+ [Foo intialize]。直到发送给Foo的其他消息才会被调用。 [FOO someMessage]不会这样做,因为FOO最初为零。这是我们倾向于使用诸如+ [Foo sharedFoo]之类的东西而不是像这样的全局变量的原因的一部分。 – 2011-03-30 01:15:49