2010-12-05 24 views
9

J'essaie d'utiliser des variables externes.Objectif C - Comment utiliser les variables externes?

Il se plaint qu'en raison de l'utilisation numberWithInt je ne suis pas passer un Constantes que la valeur de ma variable

J'enlevé const et il se plaint qu'une variable extern doit être une constante, alors quelle est la solution ici ?

JE NE VEUX PAS UTILISER INT

.h 
extern NSNumber const *MoveID; 

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

Répondre

13

Vous pouvez essayer de faire ce qui suit:

.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

Notez que la valeur de 'MoveID' ne sera pas définie avant que quelque chose ne touche la classe' MYGreatClass'. Vous * pourriez * utiliser une méthode '+ load' si c'est un problème. – bbum

1

EDIT: Je viens de réaliser que je totalement raté la question et allait sur des raisons pour lesquelles l'erreur se produisait, oups. Je vais laisser la première partie de ma réponse ici parce que Jacob Relkin le cite dans sa réponse.


Parce que [NSNumber numberWithInt:1] est pas une valeur constante de compilation, vous ne pouvez pas définir un NSNumber créé avec elle à une variable const. Il semble y avoir un radar environ extern NSNumber const s, qui semblent être non pris en charge dans Objective-C. Je suppose que vous pouvez utiliser une macro de préprocesseur pour créer NSNumber à partir de constantes ints ou flottants comme décrit in this article. Ce n'est pas la même chose que ce que vous avez l'intention de faire, mais il semble que ce soit assez proche.

3

Comme l'a dit @BoltClock, vous ne pouvez pas définir une valeur non constante être de type const.

Qu'est-ce que vous pourriez faire est la suivante:

extern NSNumber *MoveID; 

Et ...

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

@end 
0

Juste pour être complet, la méthode moderne est de ne pas le faire comme:

dans. h

extern NSNumber *MoveID; 

dans .m

NSNumber *MoveID; 

... 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

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

    ... 
} 

dispatch_once() ne fera jamais fonctionner une fois de sorte que le initialiseur ne se dédoublent pas et il est thread-safe. En outre, le code d'initialisation est réduit plus bas dans le cycle de vie de la vue.