2012-01-10 34 views
12

¿Cómo declaro una variable en el archivo main.m para que esté disponible en todas las clases?objetivo-c - variables globales

Si simplemente lo declaro en la función main, el compilador dice que no está declarado en el método de clase.

¿Debo declararlo en un objeto como este?

@public 
type variable; 

Respuesta

25

Todo lo que necesita es utilizar variables globales C simples antiguas.

En primer lugar, definir una variable en su main.m, antes de que su función main:

#import <...> 

// Your global variable definition. 
type variable; 

int main() { 
    ... 

En segundo lugar, es necesario dejar que otros archivos de origen conocen. Tiene que declarar que en algún archivo .h e importar ese archivo en toda .m archivos que necesita la variable en:

// .h file 

// Declaration of your variable.  
extern type variable; 

Tenga en cuenta que no se puede asignar un valor a la variable en el bloque de declaración, de lo contrario se convierte en una definición de ese variable, y finaliza con el error del enlazador quejándose en múltiples definiciones del mismo nombre.

dejar las cosas claras: cada variable puede ser declarado varias veces (Declaración dice que existe esta variable en alguna parte), pero define sólo una vez (en realidad crea definición de memoria para esa variable).

Pero tenga cuidado, las variables globales son una mala práctica de codificación, porque su valor puede cambiar inesperadamente en cualquiera de los archivos, por lo que puede encontrar errores difíciles de depurar. Puede evitar variables globales utilizando el patrón Singleton, por ejemplo.

+0

Imo, las variables globales en realidad hacen mucho sentido en Objective C, dada la tendencia a que una gran cantidad de cosas para ser naturalmente singletons, especialmente los controladores de vista. En este caso, actúan más como constantes que como variables. – devios1

+0

En realidad, los singleton usan una variable global, la instancia compartida, lo que hace que cada miembro sea global; solo estás reemplazando un tipo de globalidad con otro. – Cristik

10

No estoy seguro de por qué quieres hacerlo, pero podrías si quisieras.

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); 
} 

Pero, por favor, piense cuidadosamente antes de embarcarse en el uso de algo como esto!

+0

¿Por qué tener cuidado? No entiendo cuál sería el riesgo – Sirens

+1

El riesgo sería un código que no se puede mantener o posiblemente sea difícil de detectar errores. – mattjgalloway

+0

Cada una de las publicaciones que veo en Internet sobre vars globales tiene advertencias sobre "tener cuidado", y algunas otras personas dicen "¿por qué tener cuidado?". Jaja, siempre es el mismo Jazz. Personas que no quieren tener cuidado: piense que debe haber una razón oculta por la que otras personas le advierten una y otra vez;) – tothemario

2

Además de la depuración, no veo ninguna razón para intentar modificar el archivo main.m para interactuar directamente con la lógica de la aplicación.

Puede intentar definir una constante en su archivo Your_project_name_Prefix.pch, si es que se ajusta a sus necesidades. O declare una variable estática en su delegado de aplicación o en cualquiera de las clases de su aplicación.

Para obtener más información sobre las constantes y variables estáticas, siga este enlace:

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

+0

Pero esto no funciona, si necesita acceso de lectura a la var. E. g. si desea almacenar una contraseña o un ID de sesión accesible para todas las clases. –