2010-12-05 60 views
9

我想使用extern變量。Objective C - 如何使用extern變量?

它抱怨說,因爲使用numberWithInt的我不傳遞contants的價值我的變量

所以我刪除了常量和它的抱怨,一個外部變量必須是一個常量,那麼什麼是解決方案在這裏?

我不想使用int

.h 
extern NSNumber const *MoveID; 

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

回答

13

你可以嘗試做如下:

.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; 
    } 
} 
+7

請注意,「MoveID」的值不會被設置,直到某處觸及「MYGreatClass」類。如果這是一個問題,你可以使用'+ load'方法。 – bbum 2010-12-05 18:54:50

1

編輯:我才意識到,我完全錯過了問題,是怎麼回事,爲什麼錯誤發生在,哎呀呀。儘管Jacob Relkin在他的回答中引用了這個答案,但我會將答案的第一部分留在這裏。


因爲[NSNumber numberWithInt:1]是不是編譯時間常數的值,你可以不設置與它創造了一個NSNumberconst變量。

似乎有一個關於extern NSNumber const s的radar,它似乎在Objective-C中不受支持。我想你可以使用一個預處理器宏來創建NSNumber s從恆定整數或浮點數,如in this article所述。它與你打算的幾乎不相同,但它似乎非常接近。

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 
0

只是爲了保持完整性,現代的方法是要這麼做的:

。 h

extern NSNumber *MoveID; 

在.M

NSNumber *MoveID; 

... 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

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

    ... 
} 

dispatch_once()所以初始化器沒有重複將只運行一次,它是線程安全的。此外,在視圖生命週期中下推初始化代碼。