目标C - 如何使用外部变量?

时间:2010-12-05 18:08:52

标签: objective-c global-variables extern

我正在尝试使用外部变量。

它抱怨因为使用numberWithInt我没有传递一个包含作为我的变量的值

所以我删除了const并且它抱怨extern变量必须是常量,那么这里的解决方案是什么?

我不想使用INT

.h
extern NSNumber const *MoveID;

.m
NSNumber const *MoveID = [NSNumber numberWithInt:1];

4 个答案:

答案 0 :(得分:15)

您可以尝试执行以下操作:

·H

extern NSNumber *MoveID;

的.m

NSNumber *MoveID;
@implementation MYGreatClass
+ (void) initialize {
    static bool done = FALSE;
    if(!done){ // This method will be called again if you subclass the class and don't define a initialize method for the subclass
        MoveID = [[NSNumber numberWithInt:1] retain];
        done = TRUE;
    }
}

答案 1 :(得分:3)

正如@BoltClock所说,你不能将非常数值设置为const类型。

可以做的是:

extern NSNumber *MoveID;

和...

NSNumber *MoveID;
@implementation SomeClass 
static BOOL loaded = NO;
+ (void) initialize {
   if(!loaded) {
      MoveID = [[NSNumber alloc] initWithInt:1];
      loaded = YES;
   }
}
//blah blah blah

@end

答案 2 :(得分:2)

编辑:我刚刚意识到我完全错过了这个问题并且正在讨论错误发生的原因,哎呀。我会在这里留下我答案的第一部分,因为Jacob Relkin在他的回答中引用了它。


由于[NSNumber numberWithInt:1]不是编译时常量值,因此您无法将使用它创建的NSNumber设置为const变量。

似乎有一个radar关于extern NSNumber const,似乎在Objective-C中不受支持。我猜你可以使用预处理器宏来创建NSNumber来自常量整数或浮点数,如in this article所述。它与你想要的几乎不一样,但似乎非常接近。

答案 3 :(得分:0)

为了完整起见,现代方法就是这样做:

in .h

extern NSNumber *MoveID;

in .m

NSNumber *MoveID;

...

- (void)viewDidLoad {
    [super viewDidLoad];

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        MoveID = @1;
    });

    ...
}

dispatch_once()只会运行一次,因此初始化程序不会重复,并且它是线程安全的。此外,在视图生命周期中将初始化代码向下压低。