2009-08-10 5 views
0

Supposons que j'ai une variable qui a déjà été initialisée à une chaîne via une combinaison alloc/init. Aurai-je des fuites de mémoire si je le réaffecte via le traitement, c'est-à-dire.Y a-t-il une fuite de mémoire lors de la réaffectation d'une variable?

NSString *s = [[NSString alloc] initWithString:someOtherStringVariable]; 
s = [s stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

Y a-t-il eu des fuites de mémoire ici? Si oui, ai-je besoin de créer une autre variable (par exemple, s2), faire cette affectation, puis libérer l'original?

NSString *s = [[NSString alloc] initWithString:someOtherStringVariable]; 
NSString *s2 = [s stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
[s release]; 

Maintenant, que se passe-t-il si l'autre chaîne est une constante, comme @ "Une autre chaîne". Aurais-je besoin de m'inquiéter des fuites? c'est à dire.

NSString *s = [[NSString alloc] initWithString:@"Some other string"]; 
s = [s stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

Merci

Répondre

7

C'est certainement une fuite. La meilleure façon de prendre soin des questions comme celle-ci est à AutoRelease plutôt tôt que tard:

NSString *s = [[[NSString alloc] initWithString:@"Some other string"] autorelease]; 
s = [s stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

Vous pouvez également utiliser NSMutableString pour faire aussi bien, en place (si ce n'est pas un exemple fictif).

+0

Merci. L'exemple était notionnel comme vous le signalez. Je pensais avoir lu quelque part qu'il y avait de la mémoire allouée à la chaîne littérale dans tous les cas, donc elle ne serait jamais libérée. Donc il faut retenir que le compte n'était pas pertinent. – farhadf

+3

Il est vrai que vous n'avez pas besoin de libérer/gérer manuellement les littéraux de chaîne. Cependant, dans votre code, vous n'attribuez pas de chaîne littérale directement, mais faites plutôt [NSString alloc] avant. Dès que vous avez un alloc, vous avez besoin d'une version (automatique). Cela ne fuira pas: NSString * s = @ "Some string"; s = [...]; –

+0

J'ai compris. Merci. – farhadf