Фон:
У меня есть приложение с панелью вкладок. Каждая вкладка содержит контроллер навигации, позволяющий пользователю переходить от одного представления к другому, показывая подробную информацию о данных (каждое представление обрабатывается контроллером представления, и каждый класс контроллера представления имеет didReceiveMemoryWarning
метод). Списки заполняются путем извлечения данных из веб-служб.
Проблема:
Когда я использую опцию «Оборудование> Имитация памяти» в iPhone Simulator, метод didReceiveMemoryWarning
вызывается для ВСЕХ моих контроллеров представления - даже для того, который просматривает пользователь. Я не хочу очищать какой-либо контент, который используется активным контроллером представления. Как я могу этого добиться?
Какой метод должен иметь реализацию для перезагрузки данных после того, как данные были выпущены из-за предупреждения памяти? (Я вижу, что классы контроллера представления, которые содержат метод viewDidLoad
вызова табличного представления, когда пользователь возвращается к этому представлению, но если представление содержит (скажем, UIWebView), тогда viewDidLoad
метод не вызывается. Почему это так?)
Отредактировано (пятница, 30 января 2009 г., 15:10)
(Примечание: я использую построитель интерфейсов для создания представлений, а метод loadView
закомментирован.)
Итак, когда контроллер представления получает сообщение с предупреждением о памяти, выполняются следующие шаги:
Вызывается следующий метод:
- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; }
В результате вызова
[super didReceiveMemoryWarning]
автоматически вызывается[self setView:nil]
?Если какие-либо ресурсы должны быть очищены, тогда
setView
метод должен быть перезаписан, чтобы очистить локальные ресурсы.[self setView:nil]
не вызывается, если представление в настоящее время активно (по умолчанию). Правильно? - Мне действительно любопытно, какой метод принимает это решение и как?
Не могли бы вы подтвердить. Кроме того, я получал сообщение об ошибке после этого подхода, но добавление myObject = nil
после выпуска myObject
в методе dealloc
класса контроллера устранило проблему. Спасибо.