2009-02-16 6 views
42

estoy mirando el siguiente código fuente del ejemplo de manzana:El uso de la palabra clave estática en Objective-C en la definición de una variable en caché

/* 
Cache the formatter. Normally you would use one of the date formatter styles (such as NSDateFormatterShortStyle), but here we want a specific format that excludes seconds. 
*/ 
static NSDateFormatter *dateFormatter = nil; 
if (dateFormatter == nil) { 
    dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"h:mm a"]; 
} 

Tratando de averiguar:

  • ¿Por qué usar la estática ¿palabra clave?

  • Cómo esto equivale a una variable en caché si la configura en cero cada vez que se invoca el método.

El código es del ejemplo 4 en el Tableview Suite demo

Respuesta

62

Las variables estáticas conservan sus valores asignados a través de llamadas repetidas a la función. Básicamente son como valores globales que solo son "visibles" para esa función.

La declaración del inicializador solo se ejecuta una vez.

Este código inicializa dateFormatter a nil la primera vez que se utiliza la función. En cada llamada posterior a la función, se realiza una verificación contra el valor de dateFormatter. Si no está configurado (lo que solo será cierto la primera vez) a se crea una nueva fechaFormatter. Si está configurado, se usará la variable estática dateFormatter en su lugar.

Vale la pena familiarizarse con las variables estáticas. Pueden ser muy prácticos, pero también tienen inconvenientes (en este ejemplo, es imposible liberar el objeto dateFormatter, por ejemplo).

Un consejo: A veces puede ser educativo colocar un punto de interrupción en el código y echar un vistazo para ver qué está pasando. A medida que aumenta la complejidad de sus programas, esto se convertirá en una habilidad inestimable.

+1

Hola @Andrew Grant, muy buena explicación. En este caso, como lo mencionaste, es imposible liberarlo, supongamos que quiero liberarlo y asignarle un nuevo formateador de valor a la fecha, y luego cómo se debe hacer. – Ranjit

16

"static" funcionalmente significa "no evalúan las cosas en el lado derecho del signo igual cada vez que a través, utilice su valor anterior en su lugar" en este caso.

Utilice esta gran potencia con gran responsabilidad: usted corre el riesgo de utilizar una tonelada de memoria, ya que estos son objetos que nunca desaparecen. Rara vez es apropiado excepto en casos como este con NSDateFormatter.

+10

Sé que esta es la pregunta VIEJA, pero se pregunta el impacto de esta palabra clave estática en relación con ARC? – codejunkie

+3

@codejunkie statics se almacenan en una ubicación diferente que el montón. ARC se refiere a retener y liberar memoria de pila para que los valores puedan persistir más allá de los marcos de pila. Por lo tanto, dudo que ARC tenga algún efecto sobre las variables estáticas. – smileBot

1

Para propósitos de referencia, así es como estoy usando la estática para mi formateador de fecha para usar en un controlador de vista de tabla.

+ (NSDateFormatter *) relativeDateFormatter 
{ 
    static NSDateFormatter *dateFormatter; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     //NSLog(@"Created"); 
     dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 
     [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
     NSLocale *locale = [NSLocale currentLocale]; 
     [dateFormatter setLocale:locale]; 
     [dateFormatter setDoesRelativeDateFormatting:YES]; 
    }); 
    return dateFormatter; 
} 
Cuestiones relacionadas