Comment déclarer ses variables ?
muqaddar
Administrateur
Salut,
Bon, je sais pas toujours quand je dois déclarer mes variables en varaibles d'instances (donc ds le .h) ou en variables de "méthode".
Par exemple, pour une varaible qui reçoit un chemin ?
NSString* couleursFile; ds le .h
puis couleursFile = [[NSBundle mainBundle] pathForResource:@Couleurs ofType:@plist]; dans le init
ou NSString* couleursFile = [[NSBundle mainBundle] pathForResource:@Couleurs ofType:@plist]; dans le init
Sachant que je ne me servirai pas de cette variable ailleurs que ds ma méthode init ?
Bon, je sais pas toujours quand je dois déclarer mes variables en varaibles d'instances (donc ds le .h) ou en variables de "méthode".
Par exemple, pour une varaible qui reçoit un chemin ?
NSString* couleursFile; ds le .h
puis couleursFile = [[NSBundle mainBundle] pathForResource:@Couleurs ofType:@plist]; dans le init
ou NSString* couleursFile = [[NSBundle mainBundle] pathForResource:@Couleurs ofType:@plist]; dans le init
Sachant que je ne me servirai pas de cette variable ailleurs que ds ma méthode init ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
???
C'est ce que l'on appelle une variable locale à une méthode ou une fonction (en C), au début de l'exécution de cette méthode, un emplacement mémoire est alloué dans la pile pour cette variable (ici un pointeur) et désalloué à la fin de l'exécution de cette méthode.
Bien sûr, en objc il faut faire un release de la mémoire de cet objet, car elle n'est pas allouée dans la pile (stack), mais dans la mémoire globale (heap).
Je commence à être troublé par rapport à ce que j'avais appris...
Là j'alloue :
NSString* string = [NSString alloc];
Après je veux bien faire un release :
[string release];
Ou alors un autorelease au départ
NSString* string = [NSString string];
Mais faire un release après ça ? :
NSString* couleursFile = [[NSBundle mainBundle] pathForResource:@Couleurs ofType:@plist];
Là je pige plus.
Pourquoi l'autre jour tu me disais que j'initialisais des objets en autorelease sans en avoir besoin sinon ?
par ex :
NSString* string = [NSString string];
au lieu de :
NSString* string;
NSString* string = [dict objectForKey:@key];
Créer un objet lors de la déclaration est donc inutile, vu que la valeur qui va être utilisée par la suite est celle que tu définis 2 lignes plus loin.
http://www.objective-cocoa.org/index.php?p=lien&cat=47
Plus sérieusement, je peux te conseiller cet article qui résume le B-A BA de la gestion mémoire, et que tu peux consulter à chaque fois que le doute t'assailles :
http://www.stepwise.com/Articles/Technical/2001-03-11.01.html
L'article de Renaud, je l'ai déjà lu 3 fois je crois...
L'autre, je vais le regarder.
Merci.
je crois que là , c 'est plus un pb variable/objet que mémoire en fait.
Je veux bien un exemple Renaud...