Подумайте об этом так: контроллер вида не может существовать на острове. Это должно быть представлено сверху чего-то.
Это означает, что когда вы представляете один VC поверх другого, контроллер представления является «основой» для нового, который вы только что представили.
Если вы не хотите представлять виртуальные каналы друг над другом, у вас есть несколько вариантов:
1) Используйте навигационный контроллер. Это, наверное, лучший подход. Вы можете представить или нажать любой вид контроллера. Если вы решите нажать, вы можете удалить старый из стека навигации или оставить его там, чтобы пользователь мог вернуться назад. Существует много способов использования контроллера навигации, и это, пожалуй, самый гибкий способ навигации между контроллерами.
2) Используйте контроллер панели вкладок. Это работает лучше всего, если в вашем приложении всего несколько контроллеров представления, но это хорошо для определенных случаев использования.
3) Сделайте именно то, что вы сказали в своем посте (используйте контроллер корневого представления для представления / отклонения всех других VC). Как я уже сказал, вы не можете представить контроллер представления из воздуха - всегда должно быть что-то за этим. Если в вашем корневом VC не происходит множество вещей, это не должно вызывать проблем с памятью. Этот подход должен подойти, если вы не особенно внимательны к анимации между вашими контроллерами представления.
В общем, я бы не стал слишком беспокоиться об использовании памяти, пока это не станет проблемой. Должно быть хорошо представить контроллеры представления друг над другом для 99% случаев нормального использования.