static or not static

05:23 modifié dans API AppKit #1
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 :o .

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.

Réponses

  • 05:23 modifié #2
    Je ne suis pas sur de comprendre la question... réponse de base : une static permet de conserver l'état de la variable dans la fonction entre plusieurs appels...
    Je ne vois pas pourquoi elle ne serait forcément appelée qu'une seule fois.
  • BruBru Membre
    05:23 modifié #3
    Moi non plus, je ne comprends pas "appel".

    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.

    .
  • AliGatorAliGator Membre, Modérateur
    05:23 modifié #4
    Tiens, question à  ce propos :

    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 ?
  • mars 2006 modifié #5
    dans 1143032952:

    Moi non plus, je ne comprends pas "appel".

    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.

    dans 1143032952:

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

    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.


    dans 1143032952:

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

    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.
  • BruBru Membre
    05:23 modifié #6
    dans 1143033424:

    Tiens, question à  ce propos :
    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 ?


    dans 1143034953:

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

    .
  • 05:23 modifié #7
    OK

    Merci pour ces clarifications Bru.
Connectez-vous ou Inscrivez-vous pour répondre.