2010-12-05 6 views
9

私はextern変数を使用しようとしています。目的C - extern変数の使い方は?

それは文句を言い、そのnumberWithIntを使用して、私はの値としてあらわす定数を渡しておりませんので、私のだから私はconstとして除去され、外部変数が一定でなければならないことを訴えています

は、ので、ここでのソリューション何である変数?私は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

1

EDIT:私はちょうど私は完全おっと、質問を逃したし、エラーが発生した理由について起こっていたことに気づきました。ジェイコブ・リンキンが答えで引用してくれたので、ここで私の答えの最初の部分を残しておきます。


[NSNumber numberWithInt:1]は、コンパイル時定数ではありませんので、あなたはconst変数にして作成したNSNumberを設定することはできません。

extern NSNumber constradarがありますが、これはObjective-Cではサポートされていないようです。私はin this articleのように定数intsまたは浮動小数点からNSNumberを作成するためにプリプロセッサマクロを使用することができると思います。あなたの意図とほとんど同じではありませんが、かなり近いようです。

3

@BoltClockは、あなたがする非定数値を設定することはできません、言ったようにconstタイプです。あなたが行うことができ

はこれです:...

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

@end 
0

ただ、完全性について

extern NSNumber *MoveID; 

そして、近代的な方法としてそれを行うのですかです:中

。 h

extern NSNumber *MoveID; 
初期化子が重複しないようにだけ、これまで一度に実行されます.M

NSNumber *MoveID; 

... 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

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

    ... 
} 

dispatch_once()で3210

、そしてそれは、スレッドセーフです。また、ビューライフサイクルの初期化コードを下に押し下げます。