Comment déclarer ses variables ?

muqaddarmuqaddar Administrateur
15:07 modifié dans API AppKit #1
Salut,  :o

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 ?


Réponses

  • VeillardVeillard Membre
    15:07 modifié #2
    Moi, je la mettrai dans la méthode si elle n'est utilisée qu'à  cet endroit.
  • muqaddarmuqaddar Administrateur
    15:07 modifié #3
    C'est donc aussi simple que cela ?

    ???


  • mpergandmpergand Membre
    15:07 modifié #4
    Salut oxitan,

    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).
  • muqaddarmuqaddar Administrateur
    15:07 modifié #5
    Je dois faire un release même si j'ai pas fait de alloc ?
    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.

  • janvier 2005 modifié #6
    Très simple: tu dois seulement envoyer des release (ou autorelease) que lorsque tu fais toi-même un retain ou un alloc. Sinon tu ne t'en occupe pas (en supposant que l'objet ne 'vit' que jusqu'à  la fin de la méthode).
  • muqaddarmuqaddar Administrateur
    15:07 modifié #7
    OK Renaud, c'est compris.

    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;
  • 15:07 modifié #8
    Parce que 2 lignes en dessous, tu faisais

    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.
  • 15:07 modifié #9
    non, vu que l'objet est retenu par le dico, ce n'est pas nécessaire. L'autorelease n'est employé sur ce genre de méthode que lorsqu'on crée l'objet qui est renvoyé, sinon il est retenu par l'objet qui le contient.
  • muqaddarmuqaddar Administrateur
    15:07 modifié #10
    Donc objectForKey contient un autorelease aussi ?
  • Eddy58Eddy58 Membre
    15:07 modifié #11
    Oxitan, voici une adresse indispensable pour TOUT apprendre sur la gestion mémoire : ;)
    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
  • muqaddarmuqaddar Administrateur
    15:07 modifié #12
    dans 1105050564:

    Oxitan, voici une adresse indispensable pour TOUT apprendre sur la gestion mémoire : ;)
    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.
  • muqaddarmuqaddar Administrateur
    15:07 modifié #13
    dans 1105048686:

    non, vu que l'objet est retenu par le dico, ce n'est pas nécessaire. L'autorelease n'est employé sur ce genre de méthode que lorsqu'on crée l'objet qui est renvoyé, sinon il est retenu par l'objet qui le contient.


    Je veux bien un exemple Renaud...
  • BaardeBaarde Membre
    15:07 modifié #14
    Prenons l'exemple d'une classe à  laquelle tu demandes de créer une instance
    <br />+ (id)instanceWithValue:(int)value1 andValue:(int)value2<br />{<br />    Class *newInstance = [[self alloc] init];<br />    [newInstance setFirstValue:value1];<br />    [newInstance setSecondValue:value2];<br />    return [newInstance autorelease];<br />}<br />
    
Connectez-vous ou Inscrivez-vous pour répondre.