2009-05-31 4 views
2

J'apprends l'Objectif-C et je viens d'un monde de déchets. Je crée une variable de classe (statique) d'un dictionnaire et je ne sais pas si je le fais correctement pour la gestion de la mémoire ou non. J'utilise une méthode de commodité, donc l'objet devrait être libéré automatiquement, mais je ne sais pas vraiment si je dois le libérer ou le conserver dans ma classe.Quelle est la bonne façon de gérer la mémoire d'une variable/méthode de classe dans l'objectif c?

Je ne trouve pas de documentation claire sur la gestion des objets de niveau classe - tout conseil est apprécié. Merci.

+(NSDictionary*) polygonNames{   
     NSDictionary* polygonNames = [NSDictionary dictionaryWithObjectsAndKeys: 
             @"Triangle", @"3", 
             @"Square", @"4", 
             @"Square", @"4", 
             @"Pentagon", @"5", 
             @"Hexagon", @"6", 
             @"Heptagon", @"7", 
             @"Octagon", @"8", 
             @"Nonagon", @"9", 
             @"Decagon", @"10", 
             @"Hendecagon", @"11", 
             @"Dodecagon", @"12", 
             nil]; 
     return polygonNames; 

    } 
+0

Il n'y a rien de mal avec ce code, sauf qu'il va créer le dictionnaire chaque fois qu'il est appelé. –

+0

Ne répondant pas à votre question, mais - je vois que vous stockez le nombre de côtés de chaque polygone comme une chaîne. Si vous voulez vraiment stocker un numéro, enveloppez-le dans un NSNumber ie [NSNumber numberWithInt: 1] etc – Abizern

+0

Merci pour le conseil de nombre, quand j'étais toujours sous l'impression que les clés du dictionnaire dans obj c devaient être des ficelles , un examen rapide des documents et votre commentaire a éclairci cela. – WillyCornbread

Répondre

3

Si votre structure de données est immuable et ne va pas changer, vous pouvez utiliser une variable statique , comme ceci:

+ (NSDictionary *) polygonNames 
{ 
    static NSDictionary *polygonNames = nil; 
    if (!polygonNames) polygonNames = [[NSDictionary alloc] initWithObjectsAndKeys:/* objects and keys */]; 
    return polygonNames; 
} 
+0

Merci - c'est utile. Ce qui m'inquiète, c'est la «vie» de cela. Étant donné qu'il est statique dans toutes les instances, dois-je le libérer ou est-il suffisant qu'il soit «libéré» à la fin du programme? Je suppose qu'il est créé la première fois qu'une instance de la classe est demandée? Merci encore - b – WillyCornbread

+0

Il restera jusqu'à ce que l'application se termine, ce qui est bien - les fuites de mémoire ne sont que de gros problèmes (en soi) si vous ne libérez pas quelque chose qui est souvent alloué. Pour les singletons (quelque chose qui n'existe qu'une seule fois en mémoire), il est assez courant de ne pas les libérer, et de s'appuyer sur le système pour libérer la petite quantité de mémoire qu'il utilise. Pour répondre à votre deuxième question, cela affecte la valeur à la première demande. Si vous utilisez des threads, vous pouvez regarder ici: http://alanquatermain.net/post/114613488/lockless-lazily-initialized-static-global-variables –

+0

Merci beaucoup, ces réponses ont été très utiles. – WillyCornbread

2

je peux recommander le site CocoaDev.com. Sur lequel vous trouverez la règle suivante:

  • Si vous l'attribuez, le conservez ou le copiez, il vous appartient de le libérer. Sinon, ce n'est pas le cas.
  • Si vous l'attribuez, le conservez ou le copiez, vous devez le libérer. Sinon, ce n'est pas le cas. Oui: relisez-le!

Recherche de "règles de base". Comme je ne suis pas autorisé à ajouter des liens hypertexte

Fondamentalement toutes les méthodes de classe nommées dictionary*, array* et ainsi de suite renverront un objet auto-libéré que vous n'avez pas à conserver/libérer.

Pour en savoir plus je peux vous recommander la page "gestion de la mémoire".

Questions connexes