pseudo variable "de classe"
Chacha
Membre
Bonjour,
Bien que j'aie trouvé des documents en parlant, il est actuellement impossible d'utiliser des variables de classe en Objective-C avec gcc.
Ce n'est pas très grave, il suffit de déclarer une variable globale dans le fichier .m de la classe et de faire "comme si".
Cependant, je me demande quelle est la bonne manière d'initialiser/détruire une telle variable:
-pour l'initialiser, je le fais dans le +(void) initialize de la classe
-en revanche, je me pose la question de la libération de la mémoire associée à la variable. Bien sûr, quand on va quitter le programme, le système d'exploitation va libérer cette mémoire, mais je n'ai pas envie de déléguer cette tâche à quelque chose d'extérieur à mon programme.
Il n'y a pas de méthode +(void) deinitialize.
Des idées ? Comment faites-vous ?
+
Chacha
Bien que j'aie trouvé des documents en parlant, il est actuellement impossible d'utiliser des variables de classe en Objective-C avec gcc.
Ce n'est pas très grave, il suffit de déclarer une variable globale dans le fichier .m de la classe et de faire "comme si".
Cependant, je me demande quelle est la bonne manière d'initialiser/détruire une telle variable:
-pour l'initialiser, je le fais dans le +(void) initialize de la classe
-en revanche, je me pose la question de la libération de la mémoire associée à la variable. Bien sûr, quand on va quitter le programme, le système d'exploitation va libérer cette mémoire, mais je n'ai pas envie de déléguer cette tâche à quelque chose d'extérieur à mon programme.
Il n'y a pas de méthode +(void) deinitialize.
Des idées ? Comment faites-vous ?
+
Chacha
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Car, déclarer les variables dans le .m hors de l'implémentation fait que ce sont des variables de classe (au sens Objective-C du terme) !
Par contre, on ne peut pas décharger une classe (elle reste en mémoire pendant toute le vie de la "zone").
Enfin, initialize peut, dans certaines conditions, être appelé plusieurs fois par le runtime pour la même classe, il faut donc être vigilent sur cet aspect là .
.
Je veux dire comme syntaxe propre au langage. Voici la faq d'où je tire mon affirmation:
http://www.faqs.org/faqs/computer-lang/Objective-C/faq/
Et bien pour le moment, ça ne compile pas avec gcc...
Donc je n'ai pas à désallouer mes variables... il va falloir que je me fasse à cette idée !
Ah bon ? Donc il me faut mettre une garde supplémentaire
Dans quels cas peut-ce être appelé plusieurs fois ?
+
Chacha
Le cas par exemple où initialize peut être appelé plusieurs fois s'applique pour les sous-classes.
Imaginons 3 classes, A, B et C. C hérite de B qui hérite de A.
Lorsque le runtime va charger les classes, il va s'assurer que le message initialize est transmis aux classes du parent le plus éloigné vers l'enfant le plus proche. Donc dans notre cas, ce message va chronologiquement être envoyé d'abord à A, puis à B et enfin à C.
Le problème est que si B n'implémente pas la méthode de classe initialize, automatiquement, le message va au parent soit A. Donc le message sera transmis à A, puis à A (par héritage de et enfin à C.
D'où 2 appels à initialize de A.
.
Apple manquant de précision sur ce coup là :
surtout que quelques lignes plus haut on pouvait lire:
.... et après on s'etend dire RTFM
[GRILLED] merci Bru
Je viens de vérifier, c'est parfaitement exact ; mais c'est une sacrée chausse-trape ! Il y a de quoi créer de beaux bugs si l'on en n'est pas conscient.
Merci, Bru
+
Chacha
Dans la documentation Objective C d'Apple, la seule méthode évoquée pour créer des variables de classe est bien la déclaration et l'utilisation de variables "static" :
Documentation Apple
.
Je me permets de faire remonter cet intéressant post afin de savoir si l'objective-c 2.0 avait changé la donne, à savoir, y-a-t-il un moyen "propre", intégré au langage pour déclarer et manager des variables de classes ?
J'ai essayé les solutions du post en déclarant mes variables de classes dans le fichier .h (avec le mot clé static) en mettant des méthodes de classe pour y accéder/modifier mais j'ai des warnings qui me disent que mes variables ne sont pas utilisées. Ca m'embête un peut de les déclarer dans le .m...
Merci d'avance pour vos réponses !
Non pas à ma connaissance.
donc static est toujours le passage obligé dans le... .m !
Et surtout pas le .h, car chaque #import (ou include) du .h dans d'autres fichiers sources va créer ces variables inutilement.
De manière presque élégante, rien ne t'empêche de les déclarer à part dans le .m bien séparer du reste du code.
Pour m part, je fais ceci :
Oui j'avais pas pensé à ça... de toute façon le compilo plante dès qu'on se met à faire des méthodes accédant à des variables "static"(déclarées dans le .h).
Sinon dans ton code je vois ça :
Après une petite recherche sur la doc Apple j'ai lu ceci :
Donc ma question est la suivante, quelle est l'intérêt de ce booléen par rapport au code fourni par Apple ?
En tous cas merci pour ta réponse !
Je sais que le booléen est là pour éviter d'initialiser plusieurs fois les variables de classe si des sous-classes n'implémentant pas la méthode initialize: font appel à l'initialize: de la super classe.
Le truc que je me demande, c'est pourquoi utiliser un booléen qui se rappelle si on est déjà passé dans initialize alors qu'Apple nous proposer de faire le test :
C'est une autre façon de faire... celle de Apple, mais qui n'est qu'une parmi d'autre afin d"éviter d'exécuter le code initialize plusieurs fois.
C'est comme faire la sommation donnant comme résultat le chiffre 4 :
- moi, je dirais 3+1,
- Apple, dirait sans doute 1+1+1+1,
- Mala choisirait sans doute 2+2,
- alors que Mpergand écrirait 1+3...
Si toutes les solutions ont le même effet, je vais faire plaisir à Apple en choisissant la leur !