2010-07-05 8 views
0

J'ai une situation où j'ai besoin d'utiliser certaines chaînes temporairement, mais j'ai lu tellement de choses contradictoires que je suis un peu confus quant à la meilleure façon de procéder.Quelle est la meilleure façon de gérer les chaînes temporaires?

J'ai besoin d'assigner des chaînes à l'intérieur d'une si structure, mais les utiliser en dehors de la si la structure afin qu'ils doivent être créés en dehors du cas, je pensais quelque chose comme:

NSString *arbString = [[NSString alloc] init]; 

if(whatever) 
{ 
    arbString = @"Whatever" 
} 
else 
{ 
    arbString = @"SomethingElse" 
} 

myLabel.text = arbString; 
[arbString release]; 

J'ai vu des exemples où les gens juste utilisé:

NSString *arbString; 

pour créer la variable chaîne

Guide Objectif C de Google indique qu'il est préférable de autoRelease au moment de la création:

« Lors de la création de nouveaux objets temporaires, les AutoRelease sur la même ligne que vous les créez plutôt que d'une version séparée plus tard dans la même méthode »:

// AVOID (unless you have a compelling performance reason) 
MyController* controller = [[MyController alloc] init]; 
// ... code here that might return ... 
[controller release]; 

// BETTER 
MyController* controller = [[[MyController alloc] init] autorelease]; 

donc je ne sais pas, ce qui est le meilleur entraine toi?

+0

Cela a répondu à ma question, semble que je ne faisais que le formuler incorrectement. http://stackoverflow.com/questions/2706955/objective-c-if-statements-not-retaining/2706957#2706957 –

Répondre

1

Dans l'exemple que vous avez publié, vous perdez la référence à la chaîne NSString que vous avez créée lorsque vous l'avez affectée dans arbString = @"Whatever". Vous libérez ensuite la constante de chaîne (qui n'est pas réalisable, d'ailleurs).

Il y a donc une fuite de mémoire, puisque vous ne libérez jamais le NSString que vous avez créé. Rappelez-vous que tous ces types sont des pointeurs, donc = ne fait que les réattribuer. En ce qui concerne la question, dans cet exemple, vous n'avez pas besoin de [[NSString alloc] init]. Vous n'avez pas besoin de copier la chaîne dans une variable locale, vous pouvez simplement définir myLabel.text à la constante de chaîne @"Whatever".

(edit: cela ne veut pas dire que vous ne pouvez pas utiliser votre pointeur arbString, arbString = @"Whatever"; myLabel.text = arbString est bien, mais c'est juste affectation du pointeur, pas la copie.)

Si vous avez besoin de manipuler la chaîne avant de retourner ce , vous créez un NSMutableString et vous le libérez ou le libérez automatiquement. Personnellement, créer des objets auto-libérés en utilisant des méthodes de classe, donc dans cet exemple, j'utiliserais [NSString string], ou [NSString stringWithString:], qui renverraient des objets auto-libérés.

+0

Merci pour la réponse rapide. Vous avez répondu à ce que j'ai demandé mais il semble que je formulais la question de manière incorrecte, le problème était en rapport avec la portée et j'étais un peu hors cours. –

Questions connexes