我正在尝试使用外部变量。
它抱怨因为使用numberWithInt我没有传递一个包含作为我的变量的值
所以我删除了const并且它抱怨extern变量必须是常量,那么这里的解决方案是什么?
我不想使用INT
.h
extern NSNumber const *MoveID;
.m
NSNumber const *MoveID = [NSNumber numberWithInt:1];
答案 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()
只会运行一次,因此初始化程序不会重复,并且它是线程安全的。此外,在视图生命周期中将初始化代码向下压低。