2010-01-25 6 views
2

J'ai une petite question sur les deux exemples ci-dessous. Actuellement, j'utilise l'exemple le plus haut en sachant qu'en raison des ressources limitées d'iPhones, il est préférable d'allouer et de relâcher manuellement en utilisant l'exemple littéral de la chaîne du bas. Est-ce que quelqu'un a une préférence quant à celui avec qui aller?Attribution iPhone ou littéraux de chaîne pour NSString?

if(activeSegment == 0) { 
    NSString *newText = [[NSString alloc] initWithString:@"Hello World"]; 
    [helloLabel setText:newText]; 
    [newText release]; 
} 

OU

if(activeSegment == 0) { 
    NSString *newText = @"Hello World"; 
    [helloLabel setText:newText]; 
} 

Personnellement, je ne pense pas qu'il importe dans ce cas que je suis en train le texte sur une étiquette qui sera libéré wont jusqu'à la sortie de l'application de toute façon.

gary

Répondre

7

La deuxième option est définitivement meilleure. Les littéraux de chaîne ne sont que des pointeurs dans votre code, plutôt que de la mémoire allouée. La deuxième version est beaucoup plus faible. Vous pouvez aussi simplement faire:

[helloLabel setText: @"Hello World"]; 
+0

Je vois, oui, c'est parfaitement logique, merci beaucoup pour cette excellente réponse. Je vais aussi le raccourcir comme vous l'avez souligné pour utiliser la chaîne littérale directement. – fuzzygoat

+1

Pour plus d'explications, les chaînes littérales non-stockées et stockées dans le fichier binaire de votre application au moment de la compilation ne nécessitent pas d'allocation chaque fois que vous utilisez la chaîne. Certainement une grande victoire pour la mémoire au détriment d'une petite quantité de taille binaire. –

5

Certainement le deuxième s'il s'agit d'optimisation de la mémoire. Le premier alloue une chaîne en plus à la chaîne allouée statiquement avec laquelle vous l'avez initialisée (plus le surcoût d'allocation d'un objet sur le tas).

NSString *newText = [[NSString alloc] initWithString:@"Hello World"]; 

Cet extrait dynamiquement une attribue copie de « Bonjour tout le monde », mais « Bonjour tout le monde » doit exister quelque part à copier de la première.

Il convient également de noter que le compilateur réutilisera les mêmes références à des chaînes identiques chaque fois qu'il le pourra, donc si vous définissez cinq chaînes avec "Hello World" comme contenu, il n'y en aura qu'une.

+0

Merci pour l'excellente réponse, j'aurais aimé pouvoir choisir les deux pour être correct, très instructif, très apprécié. – fuzzygoat

Questions connexes