2012-01-10 20 views
12

Come si dichiara una variabile nel file main.m in modo che sia disponibile in tutte le classi?ogg-c - variabili globali

Se lo dichiaro semplicemente nella funzione main, il compilatore dice che non è dichiarato nel metodo di classe.

Devo dichiararlo in un oggetto come questo?

@public 
type variable; 

risposta

25

Tutto ciò che serve è utilizzare semplici variabili globali C vecchie.

In primo luogo, definire una variabile nel vostro main.m, prima che la funzione main:

#import <...> 

// Your global variable definition. 
type variable; 

int main() { 
    ... 

In secondo luogo, è necessario lasciare che altri file di origine sapere. È necessario dichiarare in qualche file di .h e importare il file in tutto .m file necessari la variabile in:

// .h file 

// Declaration of your variable.  
extern type variable; 

Notare che non è possibile assegnare un valore alla variabile nel blocco di dichiarazione, altrimenti diventa una definizione di che variabile, e finisci con l'errore del linker che si lamenta su più definizioni dello stesso nome.

di fare chiarezza: ogni variabile può essere dichiarata più volte (Dichiarazione afferma che questa variabile esiste da qualche parte), ma definito solo una volta (definizione crea in realtà di memoria per quella variabile).

Ma attenzione, le variabili globali sono una cattiva pratica di codifica, poiché il loro valore può essere modificato in modo imprevisto in uno qualsiasi dei file, pertanto è possibile riscontrare errori di debug. Ad esempio, puoi evitare le variabili globali usando il pattern Singleton.

+0

Imo, le variabili globali effettivamente fare un sacco di senso in Objective C, data la tendenza per un sacco di cose per essere naturalmente singleton, in particolare i controller di visualizzazione. In questo caso agiscono più come costanti che come variabili. – devios1

+0

In realtà i singleton usano una variabile globale - l'istanza condivisa -, rendendo così ogni membro globale; stai solo sostituendo un tipo di globalness con un altro. – Cristik

10

Non proprio sicuro del motivo per cui si desidera farlo, ma si potrebbe se lo si desidera.

main.m:

int someGlobal = 0; ///< Added outside any function, at the top say. 

SomeClass.m:

extern int someGlobal; ///< Added at the top, outside the class implementation. 

... 

- (void)useGlobal { 
    NSLog(@"someGlobal = %i", someGlobal); 
    someGlobal = 5; 
    NSLog(@"someGlobal = %i", someGlobal); 
} 

Ma, per favore, riflettere attentamente prima di intraprendere utilizzare qualcosa di simile!

+0

Perché fare attenzione? Non capisco quale sarebbe il rischio – Sirens

+1

Il rischio sarebbe un codice non gestibile o forse un bug difficile da rintracciare. – mattjgalloway

+0

Ogni singolo post che vedo su Internet riguardo i vars globali ha avvertimenti su "stare attenti", e alcune altre persone che dicono "perché stai attento?". Haha, è sempre lo stesso Jazz. Persone che non vogliono stare attente: pensa che ci debba essere un motivo nascosto per cui altre persone ti avvertono ripetutamente all'infinito;) – tothemario

2

Oltre al debug, non vedo alcun motivo per provare a modificare il file main.m per interagire direttamente con la logica dell'applicazione.

Si può provare a definire una costante sul file Your_project_name_Prefix.pch, se questo è adatto alle proprie esigenze. Oppure dichiarare una variabile statica sul delegato dell'applicazione o su una delle classi della tua app.

Per saperne di più sulle costanti e le variabili statiche, segui questo link:

http://iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

+0

Ma questo non funziona, se hai bisogno dell'accesso readwrite al var. E. g. se si desidera memorizzare una password o un ID di sessione accessibile a tutte le classi. –