2010-12-19 5 views
10

Sé que puede definir una variable global en Objective-C utilizando "extern", pero me acabo de dar cuenta de que las variables que había declarado en el La parte superior de mi archivo .m antes de mi primer método también fue accidentalmente global (y eso causaba algunos problemas). Los moví a la parte @interface de mi archivo de cabecera, que creo que los declara correctamente como solo existentes dentro de la clase, lo que ha resuelto algunos de mis problemas, pero todavía estoy un poco confundido.Variables globales en Objective-C - diferencia en extern y top of .m declaración de archivo

¿Cuál es la diferencia al declarar una variable como extern y ponerla en la parte superior de un archivo .m? ¿O eso resulta en lo mismo?

Respuesta

25

externo es una manera de indicar de forma explícita, para facilitar la lectura y la ejecución en tiempo de compilación, que son simplemente declarando esta variable aquí, y realmente esperamos que sea definido en otro lugar. Si también tratara de definir la variable externa, el compilador le dirá el error de sus formas. Esto es útil para las variables globales para evitar la colisión de nombres y las definiciones múltiples, las cuales le darán errores de enlazador. La palabra clave extern en sí misma, sin embargo, no hace que la variable sea global.

Lo que hace que la variable sea global es la posición de su declaración en el archivo. Si tuviera que declarar una variable fuera de la @interface en el archivo de cabecera de una clase, habría declarado una variable compartida y visible para todas las instancias de su clase, así como para cualquier persona que #importe el encabezado. Si fueras (y aparentemente lo hicieras) declarar una variable fuera de @implementation en tu clase '.m file, también habrías declarado una variable que es compartida entre todas las instancias de tu clase, pero no es visible para nadie que #importa tu encabezado.

Por lo tanto, utilice la posición de las declaraciones de variables para determinar el alcance. Solo definirá estas variables globales en un solo lugar. Para todos los demás lugares donde declararlos, prefija la declaración con extern para que el código sea legible, sus intenciones claras, y para asegurarse de que no intente y defina de nuevo.

+11

Versión corta: extern significa que existe en algún lugar, pero no aquí. No tenerlo dentro de @interface o @implementation lo convierte en un global. – ughoavgfhw

+0

Gran explicación, gracias. –

+0

¡Gracias por su ayuda! – Jackson