2010-05-22 15 views
6

frecuencia veo un fragmento de código como este en los métodos de instancia de clase:NSStrings estáticas en Objective-C

static NSString *myString = @"This is a string."; 

Me parece que no puede entender por qué esto funciona. ¿Es esto simplemente el equivalente objc de un #define que está limitado al alcance del método? Yo (creo) entiendo la naturaleza estática de la variable, pero más específicamente acerca de NSStrings, ¿por qué no se está asignando, iniciando?

Gracias ~

Respuesta

1

Para la parte de NSString alloc, init:

Creo que en primer lugar, que se pueden considerar como una conveniencia, pero no es igual de la misma para [[alloc NSString] init] .

Encontré un enlace útil aquí. Puede echar un vistazo a que NSString and shortcuts

Para la parte de #define estática y:

instancia estática en la clase significa que se puede acceder utilizando cualquier instancia de la clase. Puede cambiar el valor de estática. Para la función, significa que el valor de la variable se conserva entre las llamadas a funciones

#define se pone una macro constante para evitar el número mágico y la cadena y definir macros de función. #define MAX_NUMBER 100. luego puede usar int a [MAX_MUMBER]. Cuando se compila el código, se copiará y pegará en int a [100]

+0

¿Por qué tengo un voto negativo aquí? – vodkhang

+1

No fui yo, pero estoy de acuerdo, tu respuesta es simplemente incomprensible. Ver mi respuesta, separa la pregunta del cartel original en tres temas diferentes (cómo se tratan los literales '@" textuales, lo que hace la palabra clave 'static', y cómo esto difiere de un' # define') y da respuestas claras de quien la gente puede aprender algo. – harms

+0

Ah, está bien. Me faltaba la parte de estática. Porque, en la primera vez, solo sé sobre NSString alloc, init, así que solo respondo por esa parte. Editaré mi respuesta – vodkhang

1

Es un caso de inicio de caso especial para NSString que simplemente señala el puntero de NSString a una instancia asignada e ingresada al inicio (o tal vez perezosamente, i No estoy seguro). Hay una de estas instancias de NSString creada de esta manera para cada "" único que use en su programa.

También creo que esto es cierto incluso si no utiliza la palabra clave estática. Además, creo que todas las demás NSStrings inicializadas con esta cadena apuntarán a la misma instancia (no es un problema porque son inmutables).

No es lo mismo que un #define, porque en realidad tiene una variable NSString al crear la cadena con la inicialización = @ "cualquiera". Parece más equivalente a c const char* somestr = "blah blah blah".

9

Creo que la pregunta tiene dos partes no relacionadas.

Una es por qué no se está asignando e iniciando. La respuesta es que cuando escribe un literal de cadena Objective-C del formulario @"foo", el compilador de Objective-C creará una instancia NSString para usted.

La otra pregunta es qué hace el modificador static. Hace lo mismo que hace en una función C, asegurando que la variable myString sea la misma cada vez que se usa el método (incluso entre instancias de objetos diferentes).

A #define macro es algo bastante diferente: es un "corte y pegado programático" del código fuente, ejecutado antes de que el código llegue al compilador.

2

no ve una llamada a alloc/init porque el constructo @"..." crea una constante cadena en la memoria (a través del compilador).

En este contexto, static significa que no se puede acceder a la variable desde el archivo en el que está definida.

4

Acabo de tropezar con la misma declaración static NSString. Me pregunté cómo funciona exactamente esta magia estática, así que leí un poco. Solo abordaré la parte estática de tu pregunta.

Según K&R cada variable en C tiene dos atributos básicos: tipo (por ejemplo flotador) y almacenamiento clase (automático, registro, estático, externo, typedef).

El estática clase almacenamiento tiene dos efectos diferentes, dependiendo de si se usa:

  • interior de un bloque de código (por ejemplo, dentro de una función),
  • fuera de todos los bloques (en el mismo nivel que una función).

Una variable dentro de un bloque que no tiene que sea declarada la clase de almacenamiento por defecto es considerado como automático (es decir, es local). Se eliminará tan pronto como el bloque salga. Cuando declara que una variable automática es estática, mantendrá su valor al salir. Ese valor seguirá estando allí cuando el bloque de código sea invocado de nuevo.

Las variables globales (declaradas en el mismo nivel que una función) son siempre estáticas. Declarar explícitamente que una variable global (o una función) es static limita su alcance a solo el único archivo de código fuente. No será accesible desde y no entrará en conflicto con otros archivos fuente. Esto se llama enlace interno.

Si desea obtener más información, consulte el internal and external linkage in C.