Проблемы с памятью при нажатии многих контроллеров представления на UINavigationController

Я делаю интерактивную книгу для iPad и использую UINavigationController для реализации навигации между страницей и следующей. Когда пользователь переворачивает страницу, следующая страница перемещается поверх стека навигации.

Сейчас я на 15 страницах в приложении, и приложение вылетает, когда я пытаюсь перейти со страницы 14 на страницу 15. Нет сообщения об ошибке в консоли, ничего в журналах сбоев устройства также нет.

Каждая сцена контроллера представления в раскадровке имеет UIImageViews отображающих изображения размером от 5 МБ до 20 МБ. Метод viewDidLoad контроллеров представления вызывается только один раз. Общий размер всех активов приложения составляет менее 200 млрд. Я использую АРК.

Я запустил приложение с помощью монитора памяти Instruments. Реальное потребление памяти приложением увеличивается примерно на 80 МБ каждый раз, когда переворачивается новая страница, и происходит сбой, когда оно достигает 800 МБ (устройство — iPad 3).

  • Почему такое огромное потребление памяти? Это потому, что UIImageView в сценах раскадровки кэширует изображения?

  • Как лучше всего освободить память при использовании UINavigationController и ARC?

Я попытался добавить настройку всех подпредставлений контроллера представления на nil в методе viewDidDisappear: контроллеров представления, но потребление памяти осталось прежним.


person Eric    schedule 25.06.2012    source источник


Ответы (2)


Когда вы используете UINavigationController, каждый ViewController, который вы нажимаете, остается в памяти навсегда (ну, пока ваше приложение не выйдет), если ваш пользователь не нажмет кнопку «Назад» на этом конкретном ViewController. Он хранит стек ViewControllers — с видимым наверху.

Итак, простой ответ: не используйте для этого UINavigationController. Я бы предложил создать свой собственный ViewController, который «знает», какая страница следующая и предыдущая, и вручную загружает и удаляет их по мере необходимости. Таким образом, вы можете быть уверены, что у вас в памяти одновременно находится только одна страница (за исключением переходов — возможно, вы могли бы использовать эту анимацию для переходов http://cocoacontrols.com/platforms/ios/controls/xbpagecurl).

person Ben Clayton    schedule 25.06.2012
comment
звучит как UIPageViewController для меня. - person LightningStryk; 16.05.2014

Вы, вероятно, не хотите использовать UINavigationController для этой цели. Вы действительно хотите, чтобы один контроллер представления управлял всеми вашими страницами и отображал новую страницу в том же представлении, удаляя старую.

person hundreth    schedule 25.06.2012