2009-07-06 6 views
66

No entiendo completamente las variables estáticas cuando se definen en la implementación de una interfaz. En los métodos, entiendo cómo difieren de las variables locales, pero no cuando se definen directamente en una implementación.¿Cuál es el significado de variables estáticas en una implementación de una interfaz?

Mira estos ejemplos. ¿Qué diferencia hacen estos dos prácticamente?

#include "MyClass.h" 

@implementation MyClass 
int myInt; 
... 
@end 

Y:

#include "MyClass.h" 

@implementation MyClass 
static int myInt; 
... 
@end 

myInt es en ambos casos visibles para todos los métodos, y si interpreté una prueba de que se han ejecutado correctamente, myInt será, en ambos casos ser la misma variable para diferentes casos de la clase.

+0

Ver http://stackoverflow.com/a/4965145/654870 –

Respuesta

68

La palabra clave 'estático' en este contexto es el mismo que sería normal en C: limita el alcance de myInt al archivo actual.

+12

Además, la definición de una variable no local dentro @implementation no es diferente de la definición afuera. – sigjuice

+0

¿Pero esto realmente hace alguna diferencia para las definiciones en los archivos de implementación?No están incluidos de todos modos. – quano

+8

Supongamos que ha declarado int Varibale; en dos archivos de implementación diferentes. Obtendrá errores en el tiempo de compilación, debido a símbolos duplicados. –

16

de Apple "The Objective-C Programming Language": "Al declarar una variable estática limita su alcance a sólo la clase - y sólo la parte de la clase que se implementa en el archivo (Así, a diferencia de las variables de instancia. , las variables estáticas no pueden ser heredadas por, o directamente manipuladas por, subclases). "

80

Lamentablemente, tiene diferentes efectos dependiendo del lugar donde lo utilice.

funciones estáticas:
Por defecto, todas las funciones tienen un alcance global. El especificador estático le permite limitar el alcance de la función al archivo actual.

estáticas Las variables locales:
Cuando se utiliza el modificador static en una variable local, la función “recuerda” su valor a través de invocaciones. Por ejemplo, la variable currentCount en el siguiente fragmento nunca se restablece, así que en lugar de almacenar el conteo en una variable dentro de main(), podemos permitir que countByTwo() haga la grabación por nosotros.

// main.m 
#import <Foundation/Foundation.h> 

int countByTwo() { 
    static int currentCount = 0; 
    currentCount += 2; 
    return currentCount; 
} 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     NSLog(@"%d", countByTwo()); // 2 
     NSLog(@"%d", countByTwo()); // 4 
     NSLog(@"%d", countByTwo()); // 6 
    } 
    return 0; 
} 

Este uso de la palabra clave estática no afecta el alcance de las variables locales.
Lea más acerca de static keyword.

+6

La palabra clave estática obligará a su línea a ejecutarse SOLAMENTE una vez para todo el tiempo de ejecución de la aplicación, independientemente del número de invocaciones. – Honey

+0

¿En qué memoria está almacenada la variable estática "currentCount"? No puede estar en el marco de countByTwo porque ese marco se desasigna cuando la función finaliza. Entonces, ¿dónde está almacenado? – Enrique

16

"Tanto en C como en Objective-C, una variable estática es una variable asignada para toda la vida útil de un programa, en contraste con las variables automáticas, cuya vida útil existe durante una sola llamada de función; variables asignadas como objetos, que pueden liberarse de la memoria cuando ya no se usan. Más simplemente, el valor de una variable estática se mantiene en todas las llamadas a 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, es visible solo dentro de esa función o método, pero el valor se conserva entre llamadas ".

Mira la explicación completa aquí:

https://stackoverflow.com/a/4965145/951349

Cuestiones relacionadas