Macro constante, bien ou pas ?

FloFlo Membre
03:55 modifié dans API AppKit #1
Bonjour à  tous,

J'utilise pas mal l'instruction pré-processeur #define, mais je suis en train de me demander si cela n'aurait pas des effets de bord notamment au niveau de l'allocation mémoire de certains objets, je m'explique sur un petit exemple :

#define NAME_0 @titi
#define NAME_1 @toto

Première exemple :

<br /> NSDictionary *dico0 = [NSDictionary dictionaryWithObjectsAndKeys: NAME_0, NAME_0, NAME_1, NAME_1, nil];<br /><br /> NSDictionary *dico1 = [NSDictionary dictionaryWithObjectsAndKeys: NAME_0, NAME_0, NAME_1, NAME_1, nil];<br />


deuxième exemple :

<br /> NSString *name0 = NAME_0, *name1 = NAME_1;<br /><br /> NSDictionary *dico0 = [NSDictionary dictionaryWithObjectsAndKeys: name0, name0, name1, name1, nil];<br /><br /> NSDictionary *dico1 = [NSDictionary dictionaryWithObjectsAndKeys: name0, name0, name1, name1, nil];<br />


Si je ne n'abuse l'exemple 1 va créer plus de chaà®nes @titi et @toto que l'exemple 2 ?

Si c'est le cas, ne vaudrait-il pas mieux créer des constantes afin de pouvoir ré-utiliser les même chaà®nes si on souhaite créer des NSDictionary supplémentaires ?

Réponses

  • mpergandmpergand Membre
    03:55 modifié #2
    <br />NSString* name=@&quot;name&quot;;<br />#define NAME @&quot;name&quot;<br /><br />NSLog(@&quot;adresses: %x %x %x retainCount:%x&quot;,name,NAME,@&quot;name&quot;,[name retainCount]);<br />
    


    resultats:
    adresses: 48010 48010 48010 retainCount:7fffffff

    ;)

  • schlumschlum Membre
    03:55 modifié #3
    Aucun des deux exemples n'alloue de chaà®nes... (pour @titi et @toto en tout cas...).
    Tout pointe sur les constantes texte en dur dans l'exécutable...
  • FloFlo Membre
    03:55 modifié #4
    Donc si je comprends bien dans les deux exemples le résultat est le même ?

    On s'arrange pour nous de ne créer qu'une chaà®ne et de faire des retain dessus au endroits appropriés ?  :)
  • AliGatorAliGator Membre, Modérateur
    03:55 modifié #5
    On s'arrange pour nous de ne créer qu'une chaà®ne, oui... quand aux retain, en fait ce sont des objets constants : donc un retain dessus n'a aucun effet (c'est une méthode no-op sur les constantes), de même que release. D'ailleurs c'est comme ça aussi qu'on implémente un singleton, en rendant les retain et release no-op pour être sûr qu'on évite de détruire le singleton.
  • Philippe49Philippe49 Membre
    03:55 modifié #6
    D'ailleurs c'est déjà  comme cela en C, toutes les constantes du source sont uniques, placées à  part dans l'exécutable. Donc en Objective-C, c'est pareil. 
  • FloFlo Membre
    03:55 modifié #7
    Nickel !

    Merci à  tous !
Connectez-vous ou Inscrivez-vous pour répondre.