¿Estoy perdiendo memoria aquí?
-
23-09-2019 - |
Pregunta
Considere el siguiente método, donde construyo una cadena y lo devuelve. Me gustaría liberar los componentes básicos de la cadena, pero entonces la cadena se basa en valores que ya no existe. ¿Ahora que?
¿Estoy perdiendo memoria y si es así, ¿cómo puedo corregirlo?
- (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;
}
Al final del método, la cadena devuelta, middahStr
no ha sido puesto en libertad. ¿Es esto un problema? Am I memoria fugas?
Solución
Todo lo contrario:. Usted tiene más liberadora
middah
alloc e init. A continuación, suelte. Todo está bien.
firstPartOfMiddah
y secondPartOfMiddah
, se llama a un método de conveniencia NSString "stringWith". Esto es equivalente a invocar alloc, init, y autorelease. Tu ellos de liberación es un error, ya que se dan esencialmente a AutoRelease para liberar más tarde.
middahStr
se llama al método de conveniencia, sino devolverlo. Todo está bien. Se dará a conocer más adelante en la piscina autorelease.
La regla de oro (estoy seguro de que hay un montón de excepciones):. Si no lo hace alloc ella, no lo suelte