2012-07-08 16 views
7

Si prega di guardare in questa intestazione:Come diverse dichiarazioni di variabili statiche in 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 

E in questa implementazione:

// 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 

Ho le seguenti domande:

  1. v'è alcuna differenza fondamentale tra le dichiarazioni (4) e (5) o (6) e (7)?
  2. C'è qualche differenza tra la dichiarazione "esterna" (4) e l'ambito di applicazione (6)?
  3. Perché è possibile accedere a (6) e (7) dichiarati nell'ambito dell'implementazione in un altro ambito di implementazione (9)?
  4. Perché (2) dichiarato nell'intestazione può accedere (6) dichiarato nell'ambito di implementazione?
  5. Perché (1) e (3) generare errori Cannot combine with previous 'extern' declaration specifier, ma (0) e (2) sono compilati senza errori?

risposta

7
  1. Sì, static utilizzato in questo contesto limita la variabile al campo di applicazione del file.

    Se si dispone (4) e si dichiara id A = @"A" in un altro file nel progetto, anche senza la dichiarazione extern nell'intestazione, verrà visualizzato un errore del compilatore.

    Nel caso di (5) se si dichiara static id B = @"B" in un altro file allora funzionerà bene.

  2. No, questi sono C dichiarazioni di variabili e non seguono le regole di scoping Objective-C.

  3. Dal Objective-C è un superset di C, (6) e (7) sono le variabili globali semplicemente dichiarate come lo sarebbero in C.

  4. (2) in realtà non riferimento (6) , dichiara semplicemente ad altri file che #import "Fidati di me, c'è una variabile denominata C dichiarata in un altro file", che verrà in seguito risolta in seguito quando i file oggetto compilati sono collegati.

  5. Come detto in precedenza static limita l'ambito delle variabili al file corrente, quindi è in conflitto con extern che indica che la variabile è dichiarata in un altro file.

+0

Wow, è rock. Grazie! – Stream