2012-01-16 2 views
2

Этот вопрос был в моем сознании с тех пор, как я начал с разработки iOS: UINavigationController и использования памяти.Использование памяти: когда имеет смысл использовать UINavigationController, а когда нет?

Я вижу множество приложений, таких как iMail, Find Friends, Notes и т. Д., Где UINavigationController имеет прекрасный смысл. Они позволяют вам развернуть два или три уровня иерархии, и все.

Но представьте себе, что вы просматриваете глубокую иерархию, например файловую систему вашего Mac, начиная с корневой папки. Если бы я использовал UINavigationController, я бы продолжал толкать сотни контроллеров в стеке (в худшем случае). Я не считаю это хорошим использованием. Могут быть случаи, когда толкаемые контроллеры могут стать очень тяжелыми (насколько это касается памяти), и они просто сидят там ни для чего.

Я бы хотел, чтобы была динамическая версия UINavigationController: она просто сообщит вам, что создавать при навигации по иерархии вместо того, чтобы просто поднимать иерархию.

Теперь мой вопрос: является ли UINavigationController использоваться для глубоких иерархий? Каковы хорошие альтернативы, если вы хотите, чтобы все анимация, элементы бара и т. Д.? Или я вижу проблемы там, где их нет?

ответ

1

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

Когда контроллер верхнего уровня выскочит со стека, вы получите метод viewDidLoad, который позволит вам воссоздать ваш вид.

Если это действительно проблема, iOS5 позволяет создавать собственные «контейнеры», поэтому вы можете создать свой собственный контроллер навигации, который будет работать именно так, как вы предлагаете. Ознакомьтесь с разделом «Реализация контроллера контейнера» в документации UIViewController.

Сказав это, возможно, вам придется добавить несколько ярлыков, чтобы работать по очень глубокой иерархии. Пользовательский интерфейс может стать болезненным, если вы можете вернуться только по одному экрану за раз.

+0

Но насколько тяжелен один экземпляр UIViewController, который висит вокруг в стеке контроллеров? Даже если я выпущу все возможные данные, включая просмотры, все равно останутся некоторые вещи. Или не стоит обсуждать эти байты представления? – Krumelur

+0

Это будут ваши свойства/переменные-члены плюс еще несколько «скрытых» переменных накладных расходов. Это отличное от нуля, но оно не огромно. –

+0

Также см. Мое редактирование о создании собственного UINavigationController. –

Смежные вопросы