Initialiser une variable de classe

2»

Réponses

  • FloFlo Membre
    23:15 modifié #32

    Si tu le fais dans init, un accès direct en static:
    maVar=[MaClasse maVarStatic];

    ne passera pas par init et la variable ne sera pas initialisée.


    Ok merci, je pensais plutôt faire une méthode du style :

    <br />+ (void) maVarWithCoder: (NSCoder *)aCoder<br />{<br />&nbsp; &nbsp; &nbsp;  maVarStatic = [NSCoder decodeObjectForKey: @&quot;maVarStatic&quot;];<br />}<br />
    


    Je pense appeler cette méthode dans applicationDidFinishLaunching: de l'appDelegate, ça irait donc non ?
  • mpergandmpergand Membre
    août 2009 modifié #33
    Je pensais que tu voulais faire [?? alloc] init...

    Parce que sinon ça s'appelle un setter  ;)


    + (void) maVarWithCoder: (NSCoder *)aCoder<br />{<br />&nbsp; &nbsp; &nbsp;  maVarStatic = [NSCoder decodeObjectForKey: @&quot;maVarStatic&quot;];<br />}
    


    comprends pas ce que tu veux faire ???

    <br />- (id)initWithCoder:(NSCoder *)coder <br />{<br /><br />&nbsp; &nbsp; self = [super initWithCoder:coder]; // ou [super init];<br /><br />&nbsp; &nbsp; maVarStatic =[[coder decodeObjectForKey: @&quot;maVarStatic&quot;] retain];<br />&nbsp; &nbsp; ....<br /><br /><br />&nbsp; &nbsp; return self;<br />}<br />
    


    Le problème c'est que maintenant ça ressemble beaucoup à  une variable d'instance.

    Je suppose que ce paramètre static est fixé par l'utilisateur ? (préférences)

    Au démarrage de l'appli, tu peux faire:
    <br />// récup du param dans les prefs<br />id param= ....<br /><br />[MaClass setParam:param];<br /><br />
    


    Il te faut donc créer les méthodes d'accès comme pour une variable d'instance:
    +(id) param;
    +(void) setParam:(id) param;
  • FloFlo Membre
    août 2009 modifié #34
    Heu oui pardon, c'est moi qui débloque  ;D, ce que je souhaite en fait c'est charger certaines données à  partir d'un fichier pour initialiser ma variable de classe.

    genre :

    <br />+ (void) loadMyVar: (NSUnarchiver *)archiver<br />{<br />     &nbsp; myStaticVar = [unarchiver decodeObjectForKey: @&quot;myStaticVar&quot;];<br />}<br />
    


    et dans l'appDelegate il y aurait un appelle du genre

    <br />- (void) applicationDidFinishLaunching: (NSNotification *)aNotification<br />{<br />      // ....<br /><br />      [MyClasse loadMyVar: unArchiver];<br /><br />      // ....<br />}<br />
    


    Est-ce faisable comme ça ?

    [EDIT] Oups, je viens de comprendre ce que tu veux dire, oui c'est vrai qu'au lieu de faire une méthode qui prends un NSUnarchiver en argument on peut faire directement un setter de classe qui prend directement un object du même type que myVar.

    Mais ma question tient toujours, si j'initialise myVar avec un setter appelé dans applicationDidFinishLaunching: n'y aura-t-il pas un problème de mémoire ? Surtout en sachant que myVar est un NSMutableArray ?
  • mpergandmpergand Membre
    23:15 modifié #35
    dans 1251229156:

    Mais ma question tient toujours, si j'initialise myVar avec un setter appelé dans applicationDidFinishLaunching: n'y aura-t-il pas un problème de mémoire ? Surtout en sachant que myVar est un NSMutableArray ?


    Pareil que pour une variable d'instance:

    <br />+ (void) setMyVar: (NSMutableArray *) array<br />{<br />&nbsp; &nbsp; [myVar autorelease];<br />&nbsp; &nbsp; [array retain];<br />&nbsp; &nbsp; myVar=array;<br />}
    


    ou:

    <br />+ (void) setMyVar: (NSArray *) array<br />{<br />&nbsp; &nbsp; [myVar release];<br />&nbsp; &nbsp; myVar=[[NSMutableArray alloc] initWithArray:array];<br />}<br />
    

  • FloFlo Membre
    23:15 modifié #36
    Ok merci  :)
Connectez-vous ou Inscrivez-vous pour répondre.