2011-02-11 15 views
30

He visto algunas publicaciones sobre qué es una variable estática y creo que la obtengo, pero me encantaría escribir (o encontrar) rápidamente un programa que utiliza una variable regular y una estática, una al lado de la otra, y vea cómo/cuándo funcionan de manera diferente. Algunos códigos rápidos y sucios, quizás dos int vars y un par de declaraciones de seguimiento NSLog solo para ver CÓMO son diferentes.variables estáticas en Objective-C: ¿qué hacen?

¿Alguien tiene alguna sugerencia/idea/código que ilustre cómo una var estática difiere de una regular?

Respuesta

123

En C y Objective-C, una variable estática es una variable que se asigna para toda la vida útil de un programa. Esto está en contraste con variables automáticas, cuya vida útil existe durante una llamada de función única; y variables asignadas dinámicamente como objetos, que pueden liberarse de la memoria cuando ya no se utilizan. En términos más simples, el valor de una variable estática se mantiene en todas las llamadas de función/método. Cuando se declara fuera de una función, una variable estática es visible para todo dentro del archivo en el que se declara; cuando se declara dentro de una función o método, solo es visible dentro de esa función o método, pero el valor se conserva entre llamadas.

Digamos que tiene esto:

int f(void) 
{ 
    int i = 5; 
    i += 10; 
    return i; 
} 

Cada llamada a f() devolverá el valor 15.

Ahora supongamos que tiene esto:

int g(void) 
{ 
    static int i = 5; 
    i += 10; 
    return i; 
} 

La primera vez g() se llama, se le devolverá el valor 15. La segunda vez, se devolverá 25, ya que i mantuvo su valor de 15 y luego se incrementó en 10. Se devolverá la tercera llamada, 35. Y así.

En el contexto de las clases Objective-C, las variables estáticas se usan a menudo para imitar variables de clase, ya que Objective-C no tiene variables de clase (otros lenguajes, como Java, do). Por ejemplo, supongamos que quieres inicializar un objeto de forma perezosa y solo devolver ese objeto. Es posible que vea esto:

static MyObject *obj = nil; 

@implementation MyObject 

+ (id)sharedObject 
{ 
    if (obj == nil) obj = [[MyObject alloc] init]; 
    return obj; 
} 

@end 

obj se inicializará la primera vez classObject se llama; las invocaciones posteriores de classObject devolverán el mismo objeto. Podrías comprobar esto mediante el registro de la dirección del objeto:

NSLog(@"obj is at %p", [MyObject sharedObject]); 
NSLog(@"obj is at %p", [MyObject sharedObject]); // Will print the same address both times 

Además, obj será visible a todos los métodos en MyObject.

Esta técnica también se utiliza para implementar clases singleton en Objective-C.

obras
+0

Muy buena explicación, ¡aunque parece que la convención de nombres está al revés! :-) Lo que quiero decir es esto: la palabra STATIC significa algo que NO está cambiando, y sin embargo es la variable estática, a juzgar por su ejemplo de "int f (void)" vs. "int g (void) - es la única cuyo valor parece cambiar constantemente - ¡no es para nada estático! – Sirab33

+0

Ahora que lo pienso, ¿por qué se llama "estático"? ¿Qué es estático al respecto? – Sirab33

+0

Su asignación es estática. – NSResponder

2

estáticos en su mayoría, como en C.

  1. o bien puede inicializar una variable sólo una vez.

  2. Declarar una variable estática en un archivo por encima de @implementation bloque estará disponible para todo el archivo solamente.

1

"estática" se refiere más a los atributos de la variable (quién en dónde) que solo el valor. A diferencia de otros idiomas donde se refiere exclusivamente al valor.

  • pegajosa

Es como fijar el var a una ubicación específica, ya sea dentro de una función o en la aplicación.

  • privada

Tiene características similares a un var "privado" en el que no es visible para los hermanos o los padres, pero los niños pueden acceder.

  • clase

Es una declaración con el valor por defecto. Al igual que en otros idiomas donde se define vars dentro de una clase y asignar su valor "default":

private int myNumber = 3;

Esto nos da las variables de clase "como" dentro de funciones. Declárelos una vez, luego, cuando la función manipule el valor, el valor se conservará. La próxima vez que se llame a la función, el valor será el mismo que después del "ciclo" anterior, al igual que esperaría que el valor de una variable de clase permanezca después de la manipulación.