我想使用extern變量。Objective C - 如何使用extern變量?
它抱怨說,因爲使用numberWithInt的我不傳遞contants的價值我的變量
所以我刪除了常量和它的抱怨,一個外部變量必須是一個常量,那麼什麼是解決方案在這裏?
我不想使用int
.h
extern NSNumber const *MoveID;
.m
NSNumber const *MoveID = [NSNumber numberWithInt:1];
我想使用extern變量。Objective C - 如何使用extern變量?
它抱怨說,因爲使用numberWithInt的我不傳遞contants的價值我的變量
所以我刪除了常量和它的抱怨,一個外部變量必須是一個常量,那麼什麼是解決方案在這裏?
我不想使用int
.h
extern NSNumber const *MoveID;
.m
NSNumber const *MoveID = [NSNumber numberWithInt:1];
你可以嘗試做如下:
.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;
}
}
編輯:我才意識到,我完全錯過了問題,是怎麼回事,爲什麼錯誤發生在,哎呀呀。儘管Jacob Relkin在他的回答中引用了這個答案,但我會將答案的第一部分留在這裏。
因爲[NSNumber numberWithInt:1]
是不是編譯時間常數的值,你可以不設置與它創造了一個NSNumber
到const
變量。
似乎有一個關於extern NSNumber const
s的radar,它似乎在Objective-C中不受支持。我想你可以使用一個預處理器宏來創建NSNumber
s從恆定整數或浮點數,如in this article所述。它與你打算的幾乎不相同,但它似乎非常接近。
正如@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
只是爲了保持完整性,現代的方法是要這麼做的:
在。 h
extern NSNumber *MoveID;
在.M
NSNumber *MoveID;
...
- (void)viewDidLoad {
[super viewDidLoad];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
MoveID = @1;
});
...
}
dispatch_once()
所以初始化器沒有重複將只運行一次,它是線程安全的。此外,在視圖生命週期中下推初始化代碼。
請注意,「MoveID」的值不會被設置,直到某處觸及「MYGreatClass」類。如果這是一個問題,你可以使用'+ load'方法。 – bbum 2010-12-05 18:54:50