каков наилучший способ представления последовательности viewcontrollers, которые пользователь может скачкообразно переходить назад и вперед

#iphone #ios #ipad #uiviewcontroller

#iPhone #iOS #iPad #uiviewcontroller

Вопрос:

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

Пользовательский поток похож на запуск с домашнего viewcontroller, пользователь будет щелкать по последовательности viewcontrollers (я использую presentModalViewController для переходов). Иногда пользователь нажимает строку меню или что-то еще, чтобы вернуться к определенному viewcontroller, который он / она прошел в прошлом, или перейти к viewcontroller, который еще не был представлен. Итак, это похоже на: A-> B-> C-> D-> B-> D-> E-> F-> C-> I…

Что я делаю прямо сейчас: независимо от того, где находится пользователь, когда ему / ей нужно перейти к какому-либо другому viewcontroller, я просто создаю экземпляр целевого viewcontroller и представляю его как модальный viewcontroller.

Что ж, это работает хорошо, но с помощью инструментов я определил, что выделенная куча памяти продолжает увеличиваться с момента запуска приложения. Я предполагаю, что parentViewController (или presentingViewController в iOS 5) никогда не будет выпущен, потому что он находится в корне или середине модального стека представления, так что это все равно, что продолжать добавлять экземпляры viewcontroller.

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

Ответ №1:

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

Попробуйте использовать a UINavigationController в качестве контроллера корневого представления вашего окна. Используйте свой A контроллер представления в качестве контроллера корневого представления навигационного контроллера. Затем, когда вы захотите перейти к своему B контроллеру представления, сделайте это следующим образом (в каком-либо методе вашего текущего контроллера представления):

 UIViewController *b = [[BViewController alloc] init...];
[self.navigationController setViewControllers:[NSArray arrayWithObject:b] animated:YES];
 

Пока вы не сохраняете никаких других ссылок на свои контроллеры представления A или B, они должны быть освобождены, когда они больше не видны.

Комментарии:

1. Спасибо, я попробую этот подход. Никогда не знаешь, что NavigationController может это сделать. Но, есть ли у меня все еще эффект перехода, который я получаю, представляя modalViewController?