2012-07-08 11 views
7

favor ver esta cabecera:¿Qué diferencias con las declaraciones de variables estáticas en Objective-C?

// Test.h 
@interface Test : NSObject @end 

extern id A;    // (0) 
//extern static id B;  // (1) Uncomment to get a compiling error 
extern id C;    // (2) 
//extern static id D;  // (3) Uncomment to get a compiling error 

Y en esta implementación:

// Test.m 
#import "Test.h" 

id A = @"A";    // (4) 
static id B = @"B";  // (5) 

@implementation Test 

id C = @"C";    // (6) 
static id D = @"D";  // (7) 

@end 

// Still Test.m 

@interface Test2 : NSObject @end 
@implementation Test2 : NSObject 

+ (void)initialize { 
    NSLog(@"%@ %@", A, B); // (8) 
    NSLog(@"%@ %@", C, D); // (9) 
} 

@end 

Tengo las siguientes preguntas:

  1. ¿Hay alguna diferencia fundamental entre las declaraciones (4) y (5) o (6) y (7)?
  2. ¿Hay alguna diferencia entre la declaración "externa" (4) y la incluida en el alcance de implementación (6)?
  3. ¿Por qué se puede acceder a (6) y (7) dentro del ámbito de implementación en otro ámbito de implementación (9)?
  4. ¿Por qué (2) declarado en el encabezado se puede acceder (6) declarado dentro del alcance de implementación?
  5. ¿Por qué (1) y (3) generan errores Cannot combine with previous 'extern' declaration specifier, pero (0) y (2) se compilan sin errores?

Respuesta

7
  1. Sí, static utiliza en este contexto limita la variable al alcance del archivo.

    Si tiene (4) y declara id A = @"A" en otro archivo del proyecto, incluso sin la declaración extern en el encabezado, obtendrá un error de compilación.

    En el caso de (5) si declara static id B = @"B" en otro archivo, funcionará correctamente.

  2. No, estas son declaraciones de variables C y no siguen las reglas de alcance de Objective-C.

  3. Desde Objective-C es un superconjunto de C, (6) y (7) son las variables globales declaradas simplemente como lo serían en C.

  4. (2) en realidad no hacer referencia a (6) , simplemente declara a otros archivos que #import es "Créeme, hay una variable llamada C declarada en otro archivo", que luego se resuelve más adelante cuando los archivos del objeto compilado están vinculados.

  5. Como se mencionó anteriormente static limita el alcance de las variables al archivo actual, por lo que entra en conflicto con extern que dice que la variable se declara en otro archivo.

+0

Wow, you rock. ¡Gracias! – Stream

Cuestiones relacionadas