Контроллеры вида не освобождаются, когда вы помещаете новый контроллер в стек навигации. Контроллер навигации продолжает удерживать их, чтобы у него был правильный элемент, отображаемый при извлечении из него текущего контроллера. Если бы он выпускал его, то навигационному контроллеру было бы нечего возвращаться.
Если вы хотите оптимизировать память, используйте - (void) viewDidUnload. Он вызывается, когда когда-либо загружается представление контроллера, что может произойти, когда вы нажимаете новый контроллер. Я говорю, что это может произойти, поскольку он вызывается в условиях нехватки памяти. Так что, если у вас много свободной памяти, она не будет вызвана. В симуляторе вы можете форсировать его, имитируя предупреждение памяти. Убедитесь, что все, что вы уничтожаете в нем, может быть воссоздано в -viewDidLoad.