static or not static
Hello, il y a une question que je me pose depuis longtemps, et j'ai soudain eu une lumière: un forum, ça sert aussi à poser des questions .
Bon voici: pour les sharedInstance notamment (ou pour tout autre variable "de classe" en fait), on recommande d'utiliser [tt]static[/tt] avant la déclaration de la dite variable. Mais, à moins que je ne me trompe cette "déclaration" n'est de toute façon appelée qu'une seule fois, donc quel intérêt de mettre le static dans ces cas là ?
Merci d'avance.
Bon voici: pour les sharedInstance notamment (ou pour tout autre variable "de classe" en fait), on recommande d'utiliser [tt]static[/tt] avant la déclaration de la dite variable. Mais, à moins que je ne me trompe cette "déclaration" n'est de toute façon appelée qu'une seule fois, donc quel intérêt de mettre le static dans ces cas là ?
Merci d'avance.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je ne vois pas pourquoi elle ne serait forcément appelée qu'une seule fois.
En Objective-C, static est utile pour les 2 "facilités" qu'il offre :
- conserver la valeur de la variable en dehors de son "domaine" de définition (comme l'a dit Supermic). C'est fondamental pour une variable de classe, où cette valeur doit vivre tout le temps que la classe vit. Généralement, les valeurs static sont stockées dans la zone mémoire "globale" de l'appli.
- limiter la portée de cette variable au seul fichier source qui l'a défini. Ceci permet d'interdire l'accès à cette variable depuis d'autres fichiers sources. Pour une variable de classe (fichier source=implémentation), ça se comprend : seule la classe doit pouvoir utiliser cette variable. A noter que cette notion d'interdiction n'existe qu'à la compil.
.
Si on met une variable en "static" dans un fichier (fich1.m), à priori ça limite donc l'accès de cette variable au fichier d'après ce que tu dis Bru.
Cela nous empêche-t-il d'utiliser le mot clé "extern" dans un autre fichier fich2.m pour pouvoir y accéder ? Ou justement nous y oblige (si on avait pas mis "static" le "extern" n'aurait pas été nécessaire ?) ?
Et si c'est le cas, peut-on restreindre (avec static ou autre chose) une variable à un fichier, jusqu'à interdire d'y accéder même avec "extern" ?
Ou est-ce qu'Objective-C ne permet par cela, tout comme il ne permet pas formellement de rendre des variables privées, mais juste de les cacher du .h ?
Sorry, je n'ai pas de formation en info, donc je n'utilise pas forcément les bons termes. Dans le cas où on ferait plusieurs "appels", je pensais à un truc du genre:
for (i=0;i<10;i++) { int k; /*c c'est ça que j'entendais par "appel multiple" de la déclaration*/ } ou bien aux variables "temporaires" d'une fonction/méthode, où la zone mémoire correspondant aux variables est allouée à chaque fois que la fonction/méthode est appelée.
Oui oui, ça j'avais bien compris, seulement si on ne mets pas le static (dans le cas de variables de classe uniquement), je n'ai pas remarqué de différence dans le fonctionnement de l'appli, d'où ma question sur son utilité (taper static ne me dérange pas, j'aime juste savoir pourquoi).
La zone de stockage est une piste, en effet.
Justement, l'interdiction n'existe qu'à la compil, mais on n'importe jamais de .m, c'est également interdit (la question portant sur le cas des variables de classe, pas sur le static en général), et comme la variable est définie dans le .m, elle ne peut être utilisée ailleurs non?
Ces 2 observations me font penser que le static pour une déclaration de variable de classe est facultatif, mais il doit certainement y avoir une subtilité qui m'échappe.
Pour faire la synthèse :
- une variable globale est une variable déclarée en dehors de tout bloc (donc de toute fonction). Son stockage se situe dans la zone des variables globales de l'application (le fameux A5 world pour ceux qui ont des souvenirs de prog sous 680x0).
- tout fichier source voulant utilisé une variable globale (définie dans un autre source) doit utiliser extern. Ce mot clé indique au compilateur de ne pas réellement créer un stockage pour cette variable, mais de ré-utiliser celui précédemment créé dans l'autre fichier source.
- une variable (ou fonction) déclarée en dehors de tout bloc (donc globale) mais avec le mot clé static a pour principale fonction de masquer sa déclaration aux autres sources, même s'ils emploient extern. Cela permet donc de rendre "privé" (au sens POO du terme) une déclaration de variable. C'est donc idéal pour Objective-C qui n'implémente pas (enfin si d'après les specs, mais c'est non fonctionnel) de mécanisme de stockage de variable de classe.
- si une variable de classe Objective-C est déclarée sans static, dela fonctionnera tout aussi bien. Mais, elle pourra être visible/utilisable depuis d'autres fichiers sources vie le mot clé extern.
Voilà (d'après ma mémoire et mes vieux cours de C).
.
Merci pour ces clarifications Bru.