Я теряю память здесь? - PullRequest
       11

Я теряю память здесь?

0 голосов
/ 01 апреля 2010

Рассмотрим следующий метод, где я строю строку и возвращаю ее. Я хотел бы освободить строительные блоки строки, но тогда строка основана на значениях, которые больше не существуют. Что теперь?

У меня течет память, и если да, как я могу это исправить?

- (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;

}

В конце метода возвращаемая строка middahStr не была освобождена. Это проблема? У меня течет память?

1 Ответ

4 голосов
/ 01 апреля 2010

Скорее наоборот: вы чрезмерно выпускаете.

middah Вы выделяете и инициализируете. Тогда вы отпускаете это. Все хорошо.

firstPartOfMiddah и secondPartOfMiddah, вы вызываете вспомогательный метод NSString "stringWith". Это эквивалентно вызову alloc, init, и autorelease. Ваше освобождение от них является ошибкой, так как они по сути даны для autorelease, который будет выпущен позже.

middahStr Вы вызываете удобный метод, но возвращаете его. Все хорошо. Позже он будет выпущен пулом авто-релизов.

Правило большого пальца (я уверен, что есть множество исключений): если вы не выделите его, не отпускайте его.

...