2010-04-01 7 views
0

Considérons la méthode suivante, où je compile une chaîne et la renvoie. Je voudrais libérer les blocs de construction de la chaîne, mais la chaîne est basée sur des valeurs qui n'existent plus. Maintenant quoi? Est-ce que j'ai une fuite de mémoire et si oui, comment puis-je le corriger?Suis-je une fuite de mémoire ici?

- (NSString) getMiddahInEnglish:(int)day{ 
NSArray *middah = [[NSArray alloc] initWithObjects:@"Chesed", @"Gevurah", @"Tiferes", @"Netzach", @"Hod", @"Yesod", @"Malchus"]; 
NSString *firstPartOfMiddah = [NSString stringWithFormat: @"%@", [middah objectAtIndex: ((int)day% 7)-1]]; 
NSString *secondPartOfMiddah = [NSString stringWithFormat: @"%@", [middah objectAtIndex: ((int)day/7)]]; 

NSString *middahStr = [NSString [email protected]"%@ She'[email protected]%", firstPartOfMiddah, secondPartOfMiddah]; 

[middah release]; 
[firstPartOfMiddah release]; 
[secondPartOfMiddah release]; 

return middahStr; 

}

A la fin de la méthode, la chaîne de retour, middahStr n'a pas été publié. Est-ce un problème? Suis-je une fuite de mémoire?

+1

Non lié à la gestion de la mémoire, mais la liste des arguments pour 'initWithObjects:' doit être terminée avec 'nil'. Sinon, vous attendez juste un crash. – Chuck

+0

@Chuck, à droite. J'ai oublié cela. Je suis évidemment nouveau à ce jeu ... EDIT: Qu'en est-il un «nil» manquant provoque un accident? – Moshe

+0

Sans le néant, NSArray ne sait pas où se termine la liste des arguments et continuera à parcourir la pile jusqu'à ce qu'il atteigne un 0. – Chuck

Répondre

4

Tout le contraire: Vous êtes en train de débloquer.

middah vous allou et init. Ensuite, vous le relâchez. Tout est bien.

firstPartOfMiddah et secondPartOfMiddah, vous appelez une méthode de commodité NSString "stringWith". Cela équivaut à invoquer alloc, init, et autorelease. Votre libération est une erreur, car ils sont essentiellement donnés à autorelease pour libérer plus tard.

middahStr vous appelez la méthode de commodité, mais renvoyez-la. Tout est bien. Il sera publié plus tard par le pool autorelease.

Règle de base (je suis sûr qu'il y a beaucoup d'exceptions): Si vous ne l'attribuez pas, ne le relâchez pas.

+0

alors je peux juste enlever les deuxième et troisième 'release' et alors je suis tout bon? – Moshe

+0

Moshe: Oui, ça devrait le faire. –

+0

@Jon - Merci. 4 minutes jusqu'à ce que je puisse accepter cette réponse. – Moshe