Память UINavigationController не уменьшается при установке контроллера - PullRequest
4 голосов
/ 04 июня 2010

У меня есть приложение на основе контроллера навигации с 5 контроллерами представления внутри. Когда я нажимаю контроллер представления, я выделяю некоторую память, и когда я возвращаюсь с popViewController, мой метод delloc () вызывается правильно. Я уверен, что dealloc вызывается правильно для каждого контроллера представления, который я нажимаю и выдвигаю.

Тем не менее, когда я запускаю приложение с Инструментами (Начните с инструментов повышения производительности -> Распределение объектов, Утечки), для меня происходит странное поведение. Когда контроллер представления активен, использование памяти не уменьшается, а точнее не уменьшается, как ожидалось: когда я запускаю приложение, оно использует 950 КБ, затем я нажимаю на первый контроллер представления, и использование памяти увеличивается до 1,56 МБ, наконец я выскакиваю контроллер представления, и использование памяти теперь составляет 1,55 МБ.

Правильно ли это поведение? Я уверен, что каждый метод dealloc правильно вызывается всякий раз, когда я открываю представление, и инструмент Leaks не показывает утечки памяти. Я предполагаю, что операционная система каким-то образом «сохраняет» представление, так что во второй раз, когда я нажимаю на тот же контроллер представления, процесс загрузки происходит намного быстрее ...

Может ли кто-нибудь подтвердить, что это поведение правильно? Спасибо

Смотрите этот скриншот из инструментов

1 Ответ

6 голосов
/ 04 июня 2010

Это как и ожидалось. Правила обработки памяти «вы несете ответственность только за объекты, которые вы распределили, скопировали и т. Д.» Также применимы и здесь.

Когда вы помещаете вещи в навигационный контроллер, я предполагаю, что вы делаете это так:

MyController *myCon = [[MyController alloc] init];
[self.navigationController pushViewController:myCon animated:YES];
[myCon release]; //You have alloc and release.

NavigationController часто обрабатывает иерархию, в которой пользователь просматривает набор данных и снова поднимает его. Удерживая свои контроллеры, когда памяти достаточно, навигационный контроллер избавляет от необходимости повторного создания контроллера в течение 5 секунд. позже, когда пользователь нажимает «назад». Вы можете видеть это, потому что dealloc никогда не вызывается, но viewWillAppear и viewDidAppear вызываются при резервном копировании. Если памяти не хватает, навигационный контроллер начнет освобождать контроллеры в своем стеке.

Но! убедитесь, что переход назад и вперед не приводит к повторному созданию viewControllers, это приведет к увеличению объема памяти и возникновению утечки. NavigationController должен заметить, что он уже имеет viewController в своем стеке, и просто отобразить его.

Вы должны иметь возможность перемещаться по всем представлениям, и, если они «умещаются» в памяти, приложение никогда не должно увеличивать объем памяти, с этого момента.

...