42 votes

Utilisation du mot clé static dans objective-c lors de la définition d'une variable en cache

Je regarde l'exemple de code source Apple suivant:

     /*
 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"];
}
 

Essayer de comprendre:

  • Pourquoi utiliser le mot clé static?

  • Comment cela équivaut à une variable mise en cache si vous la définissez sur nil chaque fois que la méthode est appelée.

Le code provient de l'exemple 4 de la démonstration de Tableview Suite.

62voto

Andrew Grant Points 35305

Les variables statiques de conserver leurs valeurs assignées à répétition, des appels à la fonction. Ils sont un peu comme des valeurs globales qui ne sont "visibles" à cette fonction.

L'initialiseur de déclaration n'est exécuté qu'une fois cependant.

Ce code initialise dateFormatter à zéro la première fois que la fonction est utilisée. Sur chaque appel à la fonction, une vérification est faite contre-valeur de dateFormatter. Si ce n'est pas définie (qui ne sera vrai que la première fois) d'un nouveau dateFormatter est créé. Si elle est définie, alors la statique dateFormatter variable sera utilisée à la place.

Il vaut la peine de se familiariser avec les variables statiques. Ils peuvent être très pratique, mais ont des inconvénients trop (dans cet exemple, il est impossible de libérer le dateFormatter objet par exemple).

Juste un conseil: Parfois, il peut être éducatif pour placer un point d'arrêt dans le code et d'avoir un oeil pour voir ce qu'il se passe. Comme la complexité de vos programmes d'augmenter, cela deviendra une compétence précieuse.

16voto

Jim Puls Points 29289

" static " signifie fonctionnellement "dans ce cas, n'évaluez pas la substance située du côté droit du signe d'égalité, utilisez plutôt sa valeur précédente".

Utilisez ce grand pouvoir avec une grande responsabilité: vous courez le risque d'utiliser une tonne de mémoire, car ce sont des objets qui ne partent jamais. C'est rarement approprié sauf dans des cas comme celui-ci avec NSDateFormatter .

1voto

DogCoffee Points 3561

À titre de référence, voici comment j’utilise le paramètre statique de mon formateur de date pour l’utiliser dans un contrôleur d’affichage sous forme de tableau.

 + (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;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X