web-dev-qa-db-fra.com

variables statiques dans Objective-C - que font-elles?

J'ai vu quelques articles discuter de ce qu'est une variable statique et je pense que je comprends - mais j'aimerais écrire rapidement (ou trouver) un programme qui utilise à la fois une variable régulière et une variable statique, côte à côte, et voir comment/quand ils fonctionnent différemment. Un peu de code rapide et sale, peut-être deux vars int et quelques instructions de suivi NSLog juste pour voir COMMENT ils sont différents.

Quelqu'un a-t-il des conseils/idées/code qui illustreraient en quoi un var statique diffère d'un var régulier?

31
Sirab33

En C et en Objective-C, une variable statique est une variable qui est allouée pour toute la durée de vie d'un programme. Cela contraste avec les variables automatiques, dont la durée de vie existe pendant un appel de fonction unique; et des variables allouées dynamiquement comme des objets, qui peuvent être libérées de la mémoire lorsqu'elles ne sont plus utilisées. Plus simplement, la valeur d'une variable statique est conservée tout au long de tous les appels de fonction/méthode. Lorsqu'elle est déclarée en dehors d'une fonction, une variable statique est visible pour tout dans le fichier dans lequel elle est déclarée; lorsqu'elle est déclarée à l'intérieur d'une fonction ou d'une méthode, elle n'est visible qu'au sein de cette fonction ou méthode, mais la valeur est conservée entre les appels.

Dites que vous avez ceci:

int f(void)
{
    int i = 5;
    i += 10;
    return i;
}

Chaque appel à f() renverra la valeur 15.

Maintenant, dites que vous avez ceci:

int g(void)
{
    static int i = 5;
    i += 10;
    return i;
}

La première fois que g() est appelée, la valeur 15 Sera retournée. La deuxième fois, 25 Sera renvoyé, car i conservera sa valeur de 15 Puis s'incrémentera de 10. Le troisième appel, 35 Sera retourné. Etc.

Dans le contexte des classes Objective-C, les variables statiques sont souvent utilisées pour imiter variables de classe, car Objective-C n'a pas de variables de classe (d'autres langages, comme Java, par exemple). Par exemple, supposons que vous souhaitiez initialiser un objet paresseusement et ne renvoyer que cet objet. Vous pourriez voir ceci:

static MyObject *obj = nil;

@implementation MyObject

+ (id)sharedObject
{
    if (obj == nil) obj = [[MyObject alloc] init];
    return obj;
}

@end

obj sera initialisé la première fois que classObject sera appelé; les invocations suivantes de classObject renverront le même objet. Vous pouvez vérifier cela en enregistrant l'adresse de l'objet:

NSLog(@"obj is at %p", [MyObject sharedObject]);
NSLog(@"obj is at %p", [MyObject sharedObject]);    // Will print the same address both times

De plus, obj sera visible pour toutes les méthodes dans MyObject.

Cette technique est également utilisée pour implémenter des classes singleton dans Objective-C.

126
mipadi

travaux statiques comme en C.

  1. Il ne peut initialiser une variable qu'une seule fois.

  2. Déclarer une variable statique dans un fichier au-dessus de @implementationblock ne sera disponible que pour l'ensemble du fichier.

2
chunkyguy

"statique" se réfère davantage aux attributs de la variable (qui quoi où) plutôt qu'à la valeur. Contrairement à d'autres langues où il se réfère exclusivement à la valeur.

  • collant

C'est comme épingler la var à un emplacement spécifique, que ce soit à l'intérieur d'une fonction ou dans l'implémentation.

  • Privé

Il a des attributs similaires à un var "privé" en ce qu'il n'est pas visible pour les frères et sœurs ou les parents, mais les enfants peuvent y accéder.

  • classe

Il s'agit d'une déclaration avec une valeur par défaut. Comme dans d'autres langues où vous définissez des variables au sein d'une classe et attribuez leur valeur "par défaut":

private int myNumber = 3;

Cela nous donne des variables "de classe" dans les fonctions. Déclarez-les une fois, puis lorsque la fonction manipule la valeur, la valeur est conservée. La prochaine fois que la fonction sera appelée, la valeur sera la même qu'elle était après le "cycle" précédent, tout comme vous vous attendriez à ce que la valeur d'une variable de classe reste après la manipulation.

1
bob