2010-10-19 11 views
6

En mi archivo .m para un anuncio de clase llamada, tengo 3 cadenas estáticasObjetivo C: variable estática y global?

static NSString *AdStateDisabled = @"disable"; 
static NSString *AdStateExpired = @"expired"; 
static NSString *AdStateActive = @"active"; 

simplemente puedo usar estas variables estáticas de la clase actual, pero no puedo llamarlos de cualquier otra clase, hay una forma de hacer estas variables estáticas global? Entonces, por ejemplo, en mi clase viewcontroller puedo hacer algo como.

//HomeViewController.m 
if ([self.ad.state isEqual:Ad.AdStateDisabled]) 
{ 
    //do something 
} 

Respuesta

16

Se podría añadir las siguientes declaraciones a la cabecera HomeViewController.h, que luego deben ser importados en cualquier lugar que quería tener acceso a las cuerdas.

//HomeViewController.h 
extern NSString *AdStateDisabled; 
extern NSString *AdStateExpired; 
extern NSString *AdStateActive; 

Luego modifique sus definiciones para eliminar 'estático'.

//HomeViewController.m 
NSString *AdStateDisabled = @"disable"; 
NSString *AdStateExpired = @"expired"; 
NSString *AdStateActive = @"active"; 

Si no desea que un usuario de las cuerdas a tener que importar HomeViewController.h entonces usted podría también acaba de definir esas cadenas en AdState.h y poner las definiciones en AdState.m (y eliminarlos de HomeViewController.m) después de lo cual los usuarios de la cadena solo necesitarían importar AdState.h para usar las cadenas.

+0

Oye, hace un tiempo, hice una idea fundamental, no es compatible con ARC, pero realmente se puede usar en ARC utilizando los métodos de asignación y especificando referencias fuertes o débiles. Está un poco más cerca de lo que hizo la pregunta original: https://gist.github.com/darionco/03649feeee57f86fee3f – Dario

8

Primero, elimine la estática. Las variables y funciones estáticas en C y Objective-C significan que son visibles solo para la unidad de compilación actual (es decir, más o menos: solo el archivo en el que ha declarado la variable de statix ​​puede verlo).

A continuación, también hay que declarar las variables en un archivo de cabecera público "externo", como el de la clase asociada con la clase:

extern NSString *AdStateDisabled; 

A continuación, puede utilizarlos en otros archivos bien, pero no tendría acceso a ellos como "Ad.AdStateDisabled" sino solo como "AdStateDisabled".

Cuestiones relacionadas