2010-12-05 12 views
9

Estoy tratando de usar variables externas.Objetivo C - ¿Cómo usar variables externas?

Se queja de que a causa de la utilización de numberWithInt No estoy pasando un contants como el valor de mi variable de

Así que me quité la const y se queja de que una variable externo debe ser una constante, así que lo que es la solución aquí ?

NO QUIERO USAR INT

.h 
extern NSNumber const *MoveID; 

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

Respuesta

13

Usted puede tratar de hacer lo siguiente:

.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

Tenga en cuenta que el valor de 'MoveID' no se establecerá hasta que algo en algún lugar toque la clase' MYGreatClass'. Usted * podría * usar un método '+ load' si eso es un problema. – bbum

1

EDIT: Me di cuenta de que me perdí totalmente la cuestión e iba en acerca de por qué se produce el error, oops. Sin embargo, dejaré aquí la primera parte de mi respuesta porque Jacob Relkin la cita en su respuesta.


Debido [NSNumber numberWithInt:1] no es un valor constante de tiempo de compilación, no se puede establecer una NSNumber creado con ella a una variable const.

Parece haber un radar alrededor de extern NSNumber const s, que parecen no estar soportados en Objective-C. Supongo que puede usar una macro de preprocesador para crear NSNumber s a partir de constantes o flotantes constantes, como se describe en in this article. No es casi lo mismo que tu intención, pero parece estar muy cerca.

3

Como @BoltClock dijo, no se puede establecer un valor no constante para estar del tipo const.

Lo que podría hacer es esto:

extern NSNumber *MoveID; 

Y ...

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

@end 
0

simplemente para la corrección, el método moderno es no hacerlo como:

en. h

extern NSNumber *MoveID; 

en .m

NSNumber *MoveID; 

... 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

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

    ... 
} 

dispatch_once() nunca dejará de funcionar una vez por lo que el inicializador no se duplica, y es seguro para subprocesos. Además, presionando hacia abajo el código de inicialización más abajo en el ciclo de vida de la vista.