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
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
Ahora que lo pienso, ¿por qué se llama "estático"? ¿Qué es estático al respecto? – Sirab33
Su asignación es estática. – NSResponder