2010-08-27 3 views
0

Prenez la ligneGestion de la mémoire dans un message

[angleLabelInRadians setText:[[NSString alloc] initWithFormat:@"%.3g", [poly angleInRadians]]]; 

Lors de la création d'un objet NSString dans un message, dois-je encore besoin de libérer ce NSString et, si oui, comment pourrais-je faire cela, étant donné que havre de paix I 't créé un pointeur vers l'objet?

De plus, cette procédure de codage est-elle correcte ou cette ligne est-elle trop longue? Serait-il préférable de le diviser sous la forme suivante?

NSString *polyRad = [[NSString alloc] initWithFormat:@"%.3g", [poly angleInRadians]]; 
[angleLabelInRadians setText:polyRad]; 
[polyRad release]; 

Répondre

2

Sauf si vous êtes dans un environnement sans pool de libération automatique, vous utiliserez le plus souvent l'une des fonctions pratiques pour effectuer ce qui précède.

[angleLabelInRadians setText:[[NSString stringWithFormat:@"%.3g", [poly angleInRadians]]; 

Si vous ne souhaitez pas utiliser autoreleasing, vous devez faire

NSString *s = [[NSString alloc] initWithFormat:@"%.3g", [poly angleInRadians]]; 
[angleLabelInRadians setText:s]; 
[s release]; 
2

Règle simple: libérez tous les objets que vous avez créés avec "init" ou "new". Dans l'exemple ci-dessus, vous pouvez appeler "autorelease" pour libérer la chaîne ou l'initialiseur statique comme [NSString stringWithFormat: ...] - il utilise autorelease en interne.

1

Vous avez deux options:

Celui que vous suggered: split en trois déclaration.

Personnellement, je pense que c'est mieux. Vous avez une idée claire de ce que vous faites juste en regardant ces lignes d'arbres. Ce n'est pas clair ce que tu voulais faire en une ligne. (Mais c'est mon opinion personnelle)

Ou vous pouvez toujours faire comme Grobra dit et autorealease la chaîne.

En utilisant une méthode Convinience

[angleLabelInRadians setText:[NSString stringWithFormat:@"%.3g", [poly angleInRadians]]]; 

Ou simplement AutoRelease la chaîne

[angleLabelInRadians setText:[[[NSString alloc] initWithFormat:@"%.3g", [poly angleInRadians]] autorelease]]; 
+1

initialisation + autorelease est exactement la même chose que la méthode pratique donc pas sûr pourquoi vous avez envie de le faire , quand il y a une méthode de classe pour cela. – Kalle