A differenza di Java, dove una variabile statica è ambito per tutte le istanze di una classe, static
in C significa che una variabile è accessibile solo dall'interno del file in cui viene dichiarato. Ti permette di fare cose come dichiarare una variabile statica all'interno di una funzione, che imposta il valore solo la prima volta, like this.
Una cosa che non ho menzionato è la relazione tra le classi A, B e C. Se sono in una gerarchia di ereditarietà e ci si aspetta che la variabile statica venga ereditata come in Java, il metodo descritto da zpasternack funzionerà.
Se le tre classi non sono correlate e si desidera solo accedere al valore dichiarato in A, quindi extern
è un modo più appropriato per andare. In questo caso, si desidera dichiarare la variabile come extern
in ClassA.h, quindi definirla in Class.m. Finché ClassB e ClassC importano ClassA.h, saranno in grado di collegarsi alla stessa definizione di extern.
Una punta fine è che, invece di utilizzare extern
di per sé, è più robusto per usare OBJC_EXPORT
, che è definito in objc-api.h e maniglie compilazione in C++ pure. Ecco un esempio di codice:
// ClassA.h
OBJC_EXPORT NSString* commonString;
...
// ClassA.m
NSString* commonString = @"OldValue";
// ClassB.m
#import "ClassA.h"
...
commonString = @"NewValue"; // Can be inside a function or method
Naturalmente, utilizzando le variabili externed in questo modo crea un infame, tanto diffamato variabile globale, che è fragile che chiunque può leggere o scrivere, e l'accesso è controllato. Questo è l'approccio semplice e risponde alla tua domanda sull'utilizzo di static
rispetto a extern
.Tuttavia, come principio di progettazione, l'incapsulamento fornito dal wrapping della variabile con i metodi di classe è molto più sicuro, anche se più complesso. Nei linguaggi orientati agli oggetti, quando l'effetto che stai cercando di ottenere è quello di un metodo statico di classe, l'incapsulamento è probabilmente la strada giusta da percorrere.
fonte
2009-06-11 13:46:09
Grazie mille. Risolto. – Yogini