Estou vazando memória aqui?
-
23-09-2019 - |
Pergunta
Considere o método a seguir, onde eu construo uma string e a devolva. Eu gostaria de liberar os blocos de construção da string, mas a string é baseada em valores que não existem mais. O que agora?
Estou vazando memória e, se sim, como posso corrigi -la?
- (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;
}
No final do método, a string de retorno, middahStr
não foi lançado. Isso é um problema? Estou vazando memória?
Solução
Muito pelo contrário: você é muito liberado.
middah
você aloce e inicia. Então você libera. Tudo está bem.
firstPartOfMiddah
e secondPartOfMiddah
, você chama um método de conveniência "Stringwith" NSString. Isso é equivalente a invocar aloc, init, e autorlease. A sua liberação é um erro, pois eles são essencialmente dados ao AutoRelease para lançar mais tarde.
middahStr
Você chama o método de conveniência, mas devolve -o. Tudo está bem. Ele será lançado posteriormente pelo Pool AutorElease.
Regra geral (tenho certeza de que há muitas exceções): se você não o alocá -lo, não o solte.