Ха. Это было весело. Я написал быстрый тест, чтобы убедиться, что ни один из нас не сошел с ума.
В конце концов, все сводится к вызывающему коду:
[[MyViewController alloc] initWithNibName:nil bundle:nil];
Когда вы инициализируете контроллер представления, его объект view
еще не определен и не будет определен до тех пор, пока не будет запрошен.
Поскольку вы указываете nil
для имени пера, вы должны переопределить loadView
в своем подклассе UIViewController
, чтобы правильно установить объект просмотра. Подробнее см. в документации Apple .
Реализация по умолчанию loadView
, по-видимому, выполняет некую закулисную магию, и эта магия может привести к утечке памяти.
Итак: когда вы делаете этот звонок:
[mainWindow addSubview:currentViewer.view];
Вы на самом деле делаете два звонка:
One: currentViewer.view
, что приводит к вызову [currentViewer loadView]
и
Два: [mainWindow addSubview:...]
, который пытается добавить недавно загруженное представление.
Утечки идентифицируют эту строку из-за первого вызова, а не второго.
Чтобы проверить, просто измените метод loadView
в ваших пользовательских UIViewController
подклассах:
- (void)loadView
{
[self setView:[[UIView new] autorelease]];
}
Это предотвращает вызов по умолчанию loadView
, и теперь утечек больше нет.
Очевидно, что после дальнейшей разработки этого приложения вам придется либо добавить что-то более значимое в loadView
, либо использовать nibs.