tool plan palabras keywords hacer google generador ejemplos como claves clave objective-c caching static

objective c - plan - Usar palabras clave estáticas en objetivo-c al definir una variable en caché



palabras claves (3)

" static " significa funcionalmente "no evaluar las cosas en el lado derecho del signo igual cada vez que pasa, utilice en su lugar su valor anterior" en este caso.

Utilice esta gran potencia con una gran responsabilidad: 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 .

Estoy viendo el siguiente código fuente de ejemplo de Apple:

/* 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 descubrir:

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

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

El código es del Ejemplo 4 en la demostración de Tableview Suite


A modo de referencia, así es como estoy usando el modo estático para mi formateador de fecha para usarlo 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; }


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.

Sin embargo, la declaración del inicializador solo se ejecuta una vez.

Este código inicializa dateFormatter a nil la primera vez que se usa 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) se creará 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).

Solo 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.