Suis-je une fuite de mémoire ici?
-
23-09-2019 - |
Question
Considérez la méthode suivante, où je construis une chaîne et de le retourner. Je voudrais libérer les blocs de construction de la chaîne, mais la chaîne est basée sur des valeurs qui n'existe plus. Maintenant quoi?
Suis-je une fuite de mémoire et si oui, comment puis-je corriger?
- (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 string@"%@ She'bi@%", 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?
La solution
Bien au contraire. Vous êtes sur libération
middah
vous alloc et init. Ensuite, vous relâchez. Tout est bien.
firstPartOfMiddah
et secondPartOfMiddah
, vous appelez une méthode pratique NSString "stringWith". Cela équivaut à invoquer alloc, init, et autorelease. Votre leur libération est une erreur, car ils sont essentiellement donnés à AutoRelease pour libérer plus tard.
middahStr
vous appelez la méthode pratique, mais le retourner. Tout est bien. Il sera publié plus tard par la piscine autorelease.
Règle de base (je suis sûr qu'il ya beaucoup d'exceptions). Si vous n'alloc pas, ne relâchez pas