A diferencia de Java, donde una variable estática está en el ámbito de todas las instancias de una clase, static
en C significa que una variable es accesible sólo desde dentro del archivo donde se declara. Le permite hacer cosas como declarar una variable estática dentro de una función, que establece el valor solo la primera vez, like this.
Una cosa que no ha mencionado es la relación entre las clases A, B y C. Si están en una jerarquía de herencia y espera que la variable estática se herede como en Java, el método descrito por zpasternack funcionará.
Si las tres clases no están relacionadas, y solo desea acceder al valor declarado en A, entonces extern
es una forma más adecuada de hacerlo. En este caso, desea declarar la variable como extern
en ClassA.h, luego definirla en Class.m. Siempre que ClassB y ClassC importen ClassA.h, podrán vincularse con la misma definición externa.
Un punto bueno es que, en vez de usar extern
por sí mismo, es más robusto usar OBJC_EXPORT
, que se define en objc-api.h y maneja la compilación bajo C++ también. Aquí hay un ejemplo de código:
// 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
Por supuesto, el uso de variables externed de esta manera crea una variable global infame, tan denostada, que es frágil en el que cualquiera puede leer o escribir en él, y el acceso es controlado. Este es el enfoque simple y responde a su pregunta sobre el uso de static
frente a extern
.Sin embargo, como principio de diseño, la encapsulación proporcionada al envolver la variable con métodos de clase es mucho más segura, aunque más compleja. En los lenguajes orientados a objetos, cuando el efecto que intenta lograr es el de un método estático de clase, es probable que la encapsulación sea el camino correcto.
Muchas gracias. Lo resolvió – Yogini